| 
注册时间2009-12-26
阅读权限8
最后登录1970-1-1UID64975 初入江湖 
 
 该用户从未签到 | 
 
| 咳咳...再发菜鸟博文一篇,有关数组寻址的(其实也是八辈子都用不着的东西) 
 
 很肤浅,也很容易,各位看官就当是酒饭后的笑谈吧!
 
 
 看代码:
 
 
 首先是一维数组的寻址
 
 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
 
 
 
 
 哎,敲了好多东西哟,累死我了,眼睛都看花了~真累人撒~
 
 
 哈哈~!!!!也算是陈述明白了?!本文转自我的博客!自己无聊就随便敲了点东西~如有错误,欢迎指正!
 | 
 评分
查看全部评分
 |