今天遇到一个二级指针的问题,突然对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 |
理解指针的时候还有要注意一点:指针也是一个变量,存在内存的某处,把它就当成变量看待,指针的内容即是指针指向的地址。