假设以行优先顺序存储三维数组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的地方(完全错误的想法,脑子太糊涂了,难怪面试总过不了)
正确思路:
源码:
#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地址,你可以对它进行赋值,就相当于给数组的元素赋值。所以数组的首地址和数组的首元素的首地址是不相同的概念,请那些所谓的程序员不要误导初学者。(嗯,说的好像就是我这种什么都不懂的菜鸡)