编程C++问题

A[0],A[0][0],A[0][0][0]为什么指向同一个地址&A[0][0][0],详细解释一下

首先建立三维数组的形状概念是重要的。

一维数组可以当作一条“线”,二维数组则可以看作由多个一维数组(多条线)组成的一个“面”,那么三维数组则可以看作有多个二维数组(多个面)组成的“长方体”,见接图。

A[0]是一维数组第一个元素,A则是第一个元素A[0]的首地址。

A[0][0]是第一行第一个元素,A则是第一行的首地址,也是第一行的第一列的首地址。

A[0][0][0]是第一层第一行第一列元素,A则是第一层第一行的首地址,同时也是第一列的首地址。

追问

为什么用普通指针(int *p)和int a [2][3] ,加入是给一个int a[4][2][3]赋值的时候为什么最后循环输出的形式不一样(int * p=a[0][0],和 int *a[2][3]=&a

追答

二维数组用指针操作很容易出错,再用来操作三维数组的话,确实令人头疼,如果你一定要使用指针来操作三维数组,那就请你牢记 : 对于三维数组A[K][M][N],A是一个指针数组的头指针,且其数组元素还是指针.......。
结合截图理解,A[k]是二维数组的首地址,也就是第k层的首地址,a[k][m]是第k层第m行的首地址。
为了给第k层,第m行的第n个元素赋值,用数组则很简单,即value -> A[k][m][n],用指针时,即
value *(*(*(a + k) + m + n)

valude *(*(a + k) + m)[n]

valude *(a + k)[m][n]

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-05-20
首先这里的A应该至少是个三维数组,如果不是你可以直接PASS了(对于三维数组,我要说的是A[0][0][0]应该写成&A[0][0][0]的)。首先你要搞明白一件事情就是计算机内部是如果来保存多维数组的,计算机中可没有表结构的存储方式哦,都是线性存储的,而一般多把二维数组说成一个矩阵的形式是为了便于理解,但是在内存中保存的还是一个一维数组的形式。同时还要知道的一个是三维数组时不是可以看做一个因为数组,这个一维数组的每个元素都是一个二维数组(其实用递归的方式来理解,就是一个三维数组其本质还是一个一维数组,但是这一维数组的内容不是单个数据而是一个内容是一维数组的一维数组),同样的,这个三维数组是不是还可以理解为是一个二维数组,但是这个二维数组的每个元素都是一个一维数组。好了,现在来说明这个的意义。首先A[0][0][0]是不是这个三维数组的第一个数据啊,那么它就是不是指向内存的开始;A[0][0]按照把三维数组拆分成一个元素为一维数组的二维数组啊,那么这个A[0][0]是不是就是这个二维数组的第一个元素啊,而数组中第一个元素的内存地址和数组的地址是一样的,我想这个你应该是知道的吧。那么既然A[0][0]是这个二维数组的第一个元素,也就是说这个A[0][0]是不是和这个三维数组的内存开始地址一样啊,也就是说A[0][0]也指向了三维数组的其实地址;同样的A[0] ,它则需要把三维数组解释成元素内容是二维数组的一维数组,那么A[0]是这个一维数组的第一个元素,所以它也就是这个数组的起始地址。其实这里这三个和A都是等同的,我这里就是用A做了一个桥来连接几个的。希望能对你有所帮助。个人认为C/C++对于指针不难,对于数组不难,但是两者结合起来是超头疼的事情的,有些东西看书是很难理解的,要多想多动手画画,现在在学JAVA,所以有可能有些会记忆有误,只是给你个方向来思考而已,这个解释的方法是我自己想出来的,没有通过任何资料获得,所以。。。。。
第2个回答  2012-05-21
up
相似回答