c语言 遍历输出 3维数组

#include <stdio.h>
#include <conio.h>
int main()
{
/*声明一个3维数组A并初始化*/
int A[2][3][4]={{{1,2,3,4},{5,6,7,8},{9,10,11,12}},
{{13,14,15,16},{17,18,19,20},{21,22,23,24}}};
int*pA=A[0][0];
for(int i=0;i<2;i++)
for(int j=0;j<3;j++)
for(int k=0;k<4;k++)
printf("%d ",*(pA+i*3*4+j*4+k));
return 0;
}
我是初学者在书上看到这个例题 我看不明白,
我是指针输出 pA+i*3*4+j*4+k; 这里是指针运算
我认为i*3*4+j*4+k可能等于同一个数 输出可能重复输出
数组中的同一个元素。我就是这里不明白 ,可是这例题在书中出现
肯定有它的妙处,希望前辈能给我解释下并说明为什么。
那个输出语句若改成 printf("%d ",A[i][j][k]); 这我就理解了。

int*pA=A[0][0];

所以 i*3*4+j*4+k

由于是int指针

k增加1 就是 指针移动一个int 4字节

j增加1 就是移动 4个int 16 个字节

i增加 i 就是移动 i*3*4 = 12个 int 48字节 也就是 3位数

就是这样

有疑问请追问 满意记得采纳追问

假如 数组是int A[10][10][10];
i=0;j=2;k=4;
结果是pA+12;
i=1;j=0;k=0;
结果是pA+12;
输出结果会不会 重复??

追答

i=0;j=2;k=4; 这个不符合 因为 k 值时 0 1 2 3 所以如果是4 的话 就等于要进位 j 就等于3了

同理也要进位 所以循环里不存在这个你说的情况
i=1;j=0;k=0;

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-10-14
pA+i*3*4+j*4+k
肯定不是一般的相加,实际上就不能理解为相加。
这个式子可以理解为A[i][j][k]的指针形式。这是程序发明者规定的,不要问为什么这么写。

希望能帮助你。
第2个回答  2011-10-14
这和数组在内存中的存储有关
A[0][0][0] A[0][0][1] A[0][0][2] …………A[0][1][0]…………
指针 pA是int 型的每次只移动一个 所以就这样写了
我也是自学的 这些都是我自己的理解 我也不知道说明白了没有
如果我有说错的地方 希望高手指正
相似回答