指针

1.基本概念
指针,就是地址,地址是编号,编号是数字
指针变量,就是用于存放指针的变量,存放地址的变量,存放数字的变量
2.指针变量定义的语法格式
数据类型 *变量名称;
int * pi;
int pi;
int
pi;
语义:定义一个指针变量pi
编译器会为该变量pi分配4字节内存空间,该4字节内存空间中存储int类型变量的地址
3.指针变量的初始化
int a = 29;
int *p = &a;
*4.&取地址运算符 和 解引用运算符
&,取地址运算符 //不是按位&运算符 编译器会根据语境去做区分
,解引用运算符 //不是乘法运算符
编译器会根据语境去做区分
int a = 12; //a 是int 类型变量
int *pi = &a; //&取地址运算符 将a变量的首地址存储变量pi对应的4字节内存中去

*pi = 100; // 和 a= 100等价 将100写入到pi指向的内存
// 先根据变量名pi 找到pi对应内存
// 将pi内存中的数据读取出来作为地址使用
// 使用该地址就寻址 找到该地址对应的内存 (变量a对应的内存)
// 将100写入找到的内存中去
int b= 0;
b = *pi; //读取pi指向内存中的数据赋值b
// 先根据变量名pi 找到pi对应的内存
// 将pi内存中的数据读取出来作为地址使用
// 使用该地址去寻址 找到该地址对应的内存 (变量a对应的内存)
// 将该内存中的数据读取出来 赋值被变量b
5.指针在使用过程容易犯的错误
1)定义指针变量时容易犯的错误
int *pa, *pb; //定义了两个int 类型的指针变量 pa pb
int *pa, pb; //定义了一个int 类型的指针变量pa 和一个int类型的变量pb
2) 修改指针变量时容易犯的错误
int a, b;

 //定义并初始化时 可以pa如此赋值
 int *pa = &a; //定义指针变量pa并初始化, 对应内存中存储 a变量的地址
 
 //定义完pa之后,后续操作要改pa变量的内容 不能写成*pa = &b;
 //应该写成如下形式
 pa = &b; //修改pa中存储的内容 原来存的是a的地址 现在存储b 的地址

 *pa = b; //将b变量的值写入pa 指向的内存中去
  3) 指针变量占据的内存空间
 32bit的机器上:指针变量占据的内存空间统一为4字节
      int *pa = &a; //指针变量是变量 ,变量pa占几字节的内存空间? 4字节
      char c = 'm';
      char *ps = &c; //定义了一个char 类型的指针变量ps
                     //ps中应该存储 char类型变量的地址
                     //变量ps占几字节的内存空间呢? 4字节
 64bit的机器上:指针变量占据的内存空间统一为8字节
      int *pa / char *ps /short *ph /long *pg ;占据的内存空间大小统一为8字节

6.特殊指针:空指针和也指针
6.1空指针
指针变量中存储了一个空地址,空地址使用NULL表示,其实就是编号为0地址;

 例如:
     int *pa = NULL; //pa变量中存储的是地址0
 空指针指向的内存不能访问,如果访问直接造成程序崩溃!
     printf("pa指向的0地址内存中数据是:%#x\n", *pa); //对0地址内存执行读操作 程序直接崩溃
     
     *pa = 100; //对0地址内存执行写操作 程序直接崩溃
  
  注意:如果定义了一个全局的指针变量 没有做初始化
        系统也会自动给其赋0值(NULL)
        int *g_pa; //等价于 int *g_pa = NULL; 

6.2 野指针
就是没有初始化的局部指针变量,该变量中存储是一个随机值
指向的内存位置不确定,
如果访问野指针指向任意内存位置 ,极容易造成程序的崩溃

  例如:
       int *pa; //函数内部定义 ,pa就是一个野指针
       *pa = 200; //很容易造成程序的崩溃             
 
  C编程过程中要杜绝野指针的出现:造成有时正常运行 有时程序崩溃
  如果没有可以赋值的有效值
  一般将该指针变量赋值为NUL
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值