C语言–备忘
C 指针
一、指针定义
指针的本质就是一个变量,永远只能存储一个地址【编号】
- 通过指针变量保存的变量的地址可以对这块内存区域任意访问;
- 指针指向的内存区域可以保存一个数字,而这个数字有数据类型;
二、指针语法
- 指针变量定义的语法格式:
2.1 定义指针变量后,这个变量 pa 能保存一块内存区域的首地址,这块内存区域保存着int 类型的数据;
2.2 由于指针也是变量,也需要分配内存,与计算机硬件相关 [固定]。32位系统:一个地址值32位,4字节;64位系统,一个地址为64位,8字节;
结论: 指针变量本身没有数据类型,它指向的内存区域有数据类型,所以int 不是给指针变量用,而是给指针指向的内存区域保存的数字用;
// 形式一:int * 变量名;
int * pa;//定义一个指针变量
// 形式二:int* 变量名;
int* pa;//定义一种指针变量
// 形式三:int *变量名
int *p;//定义一个指针变量***推荐
//连续定义指针
int *pa,*pb;//两个指针变量
int *pa, pb;//pa为指针,pb为普通int 变量
若指针不初始化,地址值为任意值,危险,此指针为野指针;
三、指针初始化
初始化:
- 指针变量初始化通过取地址&来进行;
- 函数定义语法:
//分配四字节
int a=250;
//定义指针变量[4字节内存空间]//"*"为形式上的*
int *pa=&a;
// "*"为解运算符
printf("请打印%d",*pa);//
代码对应图例:
开辟4字节地址空间,指向整型变量;
四、解引用
- 通过解引用运算符:’ * ’ 和指针变量对指向内存区域进行查看和修改。
char a= 100;
char *pa=&a;
//结果pa=&a, &pa 指向pa地址, *pa=a。
printf("%p,%p,%p,%hhd,%c\n",pa,&a,&pa,*pa,a);
//分别为1、4,指针永远为4个字节
printf("sizeof(a)=%d,sizeof(pa)=%d",sizeof(a),sizeof(pa));
sizeof(指针变量名)=4B(永远)//和硬件相关,32位
五、空指针和野指针
1. 空指针
定义: 空指针变量:保存空地址,用NULL表示,其实就是编号为0的地址;NULL=0地址;不可随意访问,否则程序崩溃;
short *pb=NULL;
//报错,无法调出空指针指向的内容
printf("PB指向0地址保存的数据为:%#x",*pb);
*pb=20;
printf("测试信息为.\b");
2. 野指针
**定义:**没有初始化的指针变量,保存着随机地址,指向一块无效的内存,这块内存操作系统并没有给你分配;
int *pc;
printf("PB指向0地址保存的数据为:%#x",*pc);
*pc=250; //向随机地址写入数据
printf("测试信息");
return 0;
3. 合理使用
- 如果定义一个指针标量,不清楚指向谁,一定需要初始化NULL,否则野指针。
- 如果初始化为空指针,后续使用指针时需要对指针变量安全判断,判断是否为NULL。
- 若为NULL,让程序结束或者返回,如果有效,程序才能通过指针进行操作。
int *p=NULL;//赋值为空指针
int a=250;
p=&a;//p指向a
if(NULL==pa){
printf("pa指向空指针,不能继续访问.\n");
return -1;//exit(0)程序返回和退出
}