c语言数组寻址和指针寻址区别,有关数组寻址原理

本文通过实例代码探讨C语言中数组和指针寻址的区别,介绍了如何计算一维和二维数组中元素的内存地址,并强调了寻址公式在不同维度数组中的应用。

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

在一个论坛看到了,觉得讲得很不错。转来跟大家 分享一下

首先是一维数组的寻址

int main()

{

int arry[10] = {1,2,3,4,5,6,7,8,9,10};

return 0;

}

代码仅此而已,由于只是为了摸这数组寻址的原理和步骤,所以我就只写这点东西了,

调试,得知数组首地址为:0x0012ff58,如果我想知道他第1个元素的地址

那么依照公式:数组首地址+sizeof(type)*下标

代入各项的值可得如下公式: 0x0012ff58 + sizeof(int)*1

0x0012ff58 + 4*1

0x0012ff58 + 4

(8 + 4) = 12  转换成16进制 = C

所以由此可算出arry的第一个元素内存地址是:0x00ff12ff5c

然后是二维数组或者**数组的寻址了

看代码

int main()

{

int arry[3][3] = {{1,2,3},{1,2,3},{1,2,3}};

return 0;

}

我的天,我最讨厌的**数组,之所以讨厌**数组,是因为他绕来绕去,哎,没办法,也要理解他啊!

其实寻址方式和一维的一样

简单的来说吧

一维数组的寻址公式是:数组首地址 + sizeof(type)*数组下标

那么二维数组可以把前面的看成是后面的首地址

比方说数一维数组的首地址是arry, 现在有二维数组arry[3][3],那么我们把二维数组的首地址可以看成是arry[3],这就是他的首地址!

伪图示: 是不是这又变成了一维数组呢?

(arry[0])[3]

arry[0]  可以看成是数组名称

[3] 就是元素的个数了

根据上面的公式可以这样算:调式得知arry的首地址为:0x0012ff5c

数组存储首地址是第0个元素

所以可知 arry[0]的内存地址为0x0012ff5c

arry[0]里面有三个元素 ,那么根据公式 0x0012ff5c + sizeof(type)*下标

0x0012ff5c + (4 * 3 = )12

0x0012ff5c + c(12转换成16进制)

0x0012ff68

那么就能得到arry[1]的地址为:0x0012ff68

再根据上面公式可以知道arry[2]的地址可算出:0x0012ff68 + sizeof(type)*下标

0x0012ff68 + (4 * 3 = )12

0x0012ff68 + c(12转换成16进制)

0x0012ff74

那么就能得到arry[2]的地址为:0x0012ff74

有了上面的结果 我想算出arry[2][2]的内存地址,就有了如下的算法:

借用钱老师的一句名言“你管他什么,套公式就行了!”

数组首地址 + sizeof(type)*下标

上面算出了arry[2]的内存地址为 0x0012ff74

那么arry[2][2]就可以看成是一维数,arry[2]是数组名也就代表了首地址,

套公式:0x0012ff74 + 4 * 2

0x0012ff74 + 8

0x0012ff7c

由此可算出arry[2][2]的内存地址为:0x0012ff7c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值