三维数组与地址计算关系

2018年11月1日 885 次阅读 0 条评论

问题

求解下列问题的结果(要求使用java,但c++也是可以完成的,本段语法基本一致)

1
2
3
int a[2][2][3]={{{1,2,3},{4,5,6}},{{7,8,9},{10,11,12}}};
int *ptr = (int *)(&a + 1);
printf("%d %d",*(int *)(a + 1),*(ptr - 1));

理论分析

首先梳理一下三维数组,可以看作是个立体的坐标系,也可以这样理解(画的有一丝丝丑陋):
简易图解
也就是说外围是这四个数组每个里面有3个元素,往里来,前两个数组作为元素,进入下一层数组,依次类推。(个人方法)
首先要清楚本题中的一些基本要点a *a 和 &a 。a既是数据名,同时也作为指针指向数组中的第一个元素。 本次使用的编译器为dev c++,用sizeof函数可以得出sizeof(int)的值是4,即一个整型数据占用的字节长度是4.这个结果取决与计算机的字长,当然也和编译器有关。
我们进行计算,可以得出sizeof(a)的值为48,而sizeof(*a)的值为24,sizeof(&a)当然是8
为什么呢,因为在前面我们说,sizeof(a)中的a是整个数组a[2][2][3],里面有12个整型元素,我们知道每个整型元素占用4个字节的长度,所以对a取长度就是48了。
而*a中的a则作为指针指向第一个元素,也就是说,此时的a的意思是{{{1,2,3},{4,5,6}},{{7,8,9},{10,11,12}}}中的黄色标记部分的地址,就如同图解,这是最外层的第一个元素。所以*a就是取这个地址的值,再经过sizeof()函数,计算的就是这6个数的占用字节长度,即4*6=24

题目分析

结果1:
步骤1
绿色部分分析,a是指第一个元素的地址,那么+1则代表下一个地址,即a中第二个元素{{{1,2,3},{4,5,6}},{{7,8,9},{10,11,12}}} (黄色标记部分)
进行int *操作之后,取出黄色部分的第一个元素的地址,也就是说{7,8,9}这个数组的地址,再进行一次*操作,就取出这个数组的第一个变量的值,也就是7
结果2:
步骤2
绿色部分分析,(&a+1)先取变量a的地址,并根据a的地址获得下一个与a同类型的相邻地址。因为a的类型为a[2][2][3],那么&a+1=&a+sizeof(int)*2*3=&a+48,因此&a+1指向的地址为数组a[2][2][3]的下一个地址并赋予ptr。那么输出的时候,ptr-1,就是数组a的最后一个地址了,也就是12了。

综上所述,输出结果为 7 ,12 如有错误,多多指正

滑稽树上滑稽果,滑稽树下你和我~

文章评论(0)