今天遇到一个二级指针的问题,突然对C语言的数组和指针感觉迷糊了,下面整理一下。

定义一个数组:

int buff[1024];    数组的起始地址假设为0x0000。

定义一个指针:

int *p;    指针变量的存储地址假设为0x0100。


访问数组buff的第一个字节的方式为:buff[0] 相当于 *(buff + 0)。

访问指针p指向的数据的方式为:*(p)。


可以看出来两种访问方式是一样的,那么很显然buff也是一个指针,其实这个buff在内存中也是一个变量,一个指针变量。在定义buff数组的时候编译器开辟了一块1024字节的内存空间,同时编译器也定义了一个指针变量:

int *p_buff = 0x0000;    

这个指针变量指向buff数组的首地址,假设这个指针变量的存储地址为0x0200。所以访问buff数组的时候其实是访问p_buff指针,通过p_buff指针获得到数组buff的首地址然后进行数据读写。

假设定义一个二级指针指向p_buff:

int **pp_buff = &p_buff;

这时候pp_buff这个变量的内容就是p_buff的地址也就是0x0200,假设pp_buff的变量地址为0x0300,通过pp_buff访问buff数组的第一个字节的话第一步是要获取p_buff的地址,也就是pp_buff的内容,然后得到p_buff的地址之后获取p_buff的内容,该内容就是buff数组的存储首地址,获得首地址之后就能进行数组内容存取了,表述成C语言就是:

first_data = *(*pp_buff);


内存中的内容如下表所示:

名称 地址 内容
buff数组 0x0000 xxxxx
p_buff 0x0200 0x0000
pp_buff 0x0300 0x0200


理解指针的时候还有要注意一点:指针也是一个变量,存在内存的某处,把它就当成变量看待,指针的内容即是指针指向的地址。