三维数组的地址计算问题

假设以行优先顺序存储三维数组A[5][4][3],其中元素A[0][0][0]的地址为0,且每个元素占2个存储单元,则printf("%d\n",A[4][3]+2)输出什么


好吧,我在笔试的时候居然写了个160,我以为是A[4][3]已经到了5*4*2的地方,也就是40,然后再加5*4*2,就又是一个40,再乘以2就是到了160的地方(完全错误的想法,脑子太糊涂了,难怪面试总过不了)


正确思路:

行优先:从右往左进位
列优先:从左往右进位

把三维坐标想象成立方体。分配的空间A[5][6][7]表示层高为5、行数为6、列数为7
因为数数的基本单位其实是列,二维坐标是行号列号,虽然平时可能习惯行号列号层号,但是按照二维的规律,那么三维坐标应该是层号行号列号

那么A[4][3][2]中4、3、2分别对应这个点的层数、行号、列号
位置为4*(4*3)+3*3+2=59
每个元素两个存储单元,最终结果为59*2=118

源码:

#include<stdio.h>
#include<string.h>
int main(int argc, const char *argv[])
{
    short a[5][4][3];
    printf("short:%d\n",sizeof(a[0][0][0]));
    printf("a[5][4][3]:%d\n",sizeof(a)/sizeof(a[0][0][0]));
    printf("a[5][4][3]:%d\n",&(a[4][3][2])-&a[0][0][0]);
    printf("a[5][4]+2:%d\n",(a[4][3]+2)-&a[0][0][0]);

    return 0;
}

运行结果:



这里就有个问题值得思考了,为什么输出的是实际的个数,而不是两者地址的减呢?

来看下面的示例



看到这里应该稍微明白了一点,三维数组第一个元素地址和第二个元素地址之间确实是差2
但是为什么减是1呢?
我是这么想的,&a[0][0][0]就可以假设是指针p1,&a[0][0][1]就可以假设是指针p2,那一减不就是1吗?
&a[0][0][0]不是这个元素的首地址,而是这个数组的首地址,指的是这个元素所拥有的这一块(2个字节)地址,恩,不晓得我说的对不对,如果不对的话,请在下面评论或者私信我。

这是杨哥的一篇关于指针的博客:下面这段话的出处
http://blog.youkuaiyun.com/morixinguan/article/details/50446419

  我们也常听很多人说,数组的首地址就是数组的第一个元素,可以这么说,但是,它们之间实质是不能等效的,为什么这么说?

         数组的首地址和数组的首元素的首地址是完成不同的概念,看着名字很像,其实有所区别。数组名是个左值,但不是可修改的左值,而数组首元素的首地址,也就是0地址,你可以对它进行赋值,就相当于给数组的元素赋值。所以数组的首地址和数组的首元素的首地址是不相同的概念,请那些所谓的程序员不要误导初学者。(嗯,说的好像就是我这种什么都不懂的菜鸡)


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值