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。

 

posted @ 2020-05-29 18:59  chenjian688  阅读(186)  评论(0编辑  收藏  举报