C语言指针学习
一、明确几个符号
1、&取地址符,*取值符
二、定义指针变量风格
1、char *a
别用cha* a=NULL,容易引起歧义
例如char* a , b;//其实是定义指针a,和char型变量b。
定义多个指针用:
char *a = NULL,*b = NULL;
2、定义指针时初始化
因为指针a到底指向哪里,我们不知道。随便改变这个地址的值,可能导致一些有用的数据被「莫名其妙地修改」。
char *buf = NULL;
三、数组名其实就是一个「地址信息」,实际上就是数组「第一个元素的地址」
char a[100]; //&a[0] 和 a一样,都是数组的第一个元素的地址
四、指向数组的指针
1、这是个宏观概念,“指向数组”并不是指针就是数组,你可以理解为将指针和数组联系起来。一般我们将指针指向数组第一个元素的地址,其实指向数组的任何一个变量的地址都是可以的。
char a[100]; char *p = NULL //方法一: p = a; //方法二: p = &a[0];
2、当指针指向数组元素的时候,可以对指针变量进行「加减」运算,+n表示指向p指针所指向的元素的「下n个元素」,-n表示指向p指针所指向的元素的「上n个元素」。并不是将地址加1。
3、其实使用指针法来访问数组的元素,不一定需要定义一个指向数组的单独的指针变量,因为数组名自身就是指向数组「第一个元素」的指针,因此指针法可以直接作用于数组名:
五、内存与地址
1、内存里面每一个字节都有一个地址,字节是地址编号的最小单位
比如定义int a[3]={0,1,2};
a[0]的地址=0x7fff569f16cc
a[1]的地址=0x7fff569f16d0
两者相差4,原因是每个元素都站4个字节。每个字节都有地址的最小单位。
2、不管定义时将指针定义成何种类型,指针本质上都是一个数字,其位数由编译器(我的VScode)来决定。
比如我的编译器是32位,那么无论是定义一个char *pc还是定义一个int *pi,本质上pc与pi都是一个32位的数,但是由于"char *" 和 "int *"的限制,所以pc+1是自加8bit,而pi+1是自加32bit。