C语言的数组和指针

今天遇到一个二级指针的问题,突然对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数组0x0000xxxxx
p_buff0x02000x0000
pp_buff0x03000x0200


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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值