浅谈 二维数组、指针数组、数组指针、二级指针的区别

本文详细解释了C语言中四种不同类型的数组存储方式:二维数组、指针数组、数组指针与二级指针,并通过内存布局与取值方式对比,帮助读者深入理解它们之间的区别与应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

声明:6行5列
二维数组:char ary[6][5];///内存大小 6*(5*sizeof(char));
指针数组:char *ary[6];//(char *) ary[5],内存大小 6*sizeof(char *)
数组指针:char (*ary)[5];///内存大小(sizeof(char* [])) 大小为一个指针的大小
二级指针:char **ary;///sizeof(char **)


内存布局:



ary[i][j]取下标,上述4中变量在c中的代码一样:*(*(ary + i) + j)
但其内部寻址方式是不同的
1、二维数组: *(*(ary + i * 5 * sizeof(char)) + j * sizeof(char))
2、指针数组: *(*(ary + i * sizeof(char *)) + j * sizeof(char))
3、数组指针的本质是一个指向数组的指针,然而此处我们让它指向了
ary[0]的位置,由于二维数组(此处不能是动态分配内存)在内存中的
布局是连续的,所以我们可以可以通过数组指针访问二维数组,其实这
早已超出了它本身的范围,如果二维数组是动态分配的,那么下面的
取值方式是不合理的
数组指针: *(*(ary + i * 5 * sizeof(char)) + j * sizeof(char))
4、二级指针: *(*(ary + i * sizeof(char *)) + j * sizeof(char)

 附注:
 上述中的二维数组都是指char ary[][]这样的形式的,动态分配的二维数组是要
 靠指针数组实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值