(普通二维数组与行指针)与(指针数组与二重指针)的关系

本文详细阐述了C语言中二维数组、行指针和指针数组的区别与联系。二维数组本质上是内存中的一维连续存储,而行指针和指针数组则涉及到了对指针的指针操作。通过实例解析了它们在内存中的表示方式以及如何通过指针访问元素。重点讨论了行指针如何指向二维数组,以及二重指针如何指向指针数组,揭示了这两种数据结构在内存布局和计算地址上的差异。
摘要由CSDN通过智能技术生成

背景

今天遇到有朋友询问这个问题,发现自己已经忘记了,粗浅的复习了下,描述的了一下自己的理解,如有错误还望斧正,希望不要误人子弟了

普通二维数组与行指针:

普通二维数组定义:int a[10][20]
内存本质:a本质上是一个指针,指向空间中的一个位置,在这个位置上,a[0][0]到a[9][19]连续排列。
在编译过程中:a[5][10]都是要转化为类似*(*(a+5size(10*int))+10*size(int))这样的形式然后计算出地址
**对于运算符
的解释**:假设p为地址,则*p表示p所在地址存的数据。在c语言中如a[5][10]可以用*(*(a+5)+10)来表示,可见这时,size里面的值是不用我们写出来的,这说明在开始编译的时候,这几个值就决定了。

重点:可以用行指针 int (*p)(10)指向上述普通二维数组的a而不会出错

指针数组与二重指针

指针数组定义:int* (p[10]) 等价于 int p[10] 附:因为会先和左边的int结合,所以括号不加也可以
内存本质:p本质上是一个指向指针的指针,它指向了10个排列在一起的int类型的指针。
使用说明:这个时候p[5]表示某个指针,可以手动使得这个p[5]指向如list[20]
即:
int
(p[10]);
int list[20];
p[5]=list;
此时,p[5][10]的值就是list[10]的值。
编译过程中:与上面普通二维数组不同的是,a[5][10]转化为类似 *(*(a+5*size(int*))+size(int))然后计算出地址
同样,在c语言中可以用*(*(a+5)+10)来表示。这时候与上面写出来(不带size)的表示一样,实际本质是不一样的。

*(*(a+5*size(10*int))+10*size(int)) 上面的式子是
*(*(a+5*size(int*))+size(int)) 此处的式子是
可清楚的看到不同的地方,一个是10*int一个是int*,这就是两种指针不同的地方。因为行指针指向的是每列数据都在行上连续排列,二重指针指向的却是一串连续的存储指针的空间。

重点:可以用二重指针 int**a指向上述指针数组的p而不会出错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值