#include <stdio.h>
int main(void)
{
int i = 0;
int j = 0;
int k = 0;
//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 a[2][3][4] = { { //a[0]
{ //a[0][0]
1, //a[0][0][0] 0xbfd3d210
2, //a[0][0][1] 0xbfd3d214
3, //a[0][0][2] 0xbfd3d218
4 //a[0][0][3] 0xbfd3d21c
},
{ //a[0][1]
5, //a[0][1][0] 0xbfd3d220
6, //a[0][1][1] 0xbfd3d224
7, //a[0][1][2] 0xbfd3d228
8 //a[0][1][3] 0xbfd3d22c
},
{ //a[0][2]
9, //a[0][2][0] 0xbfd3d230
10, //a[0][2][1] 0xbfd3d234
11, //a[0][2][2] 0xbfd3d238
12 //a[0][2][3] 0xbfd3d23c
}
},
{ //a[1]
{ //a[1][0]
13, //a[1][0][0] 0xbfd3d240
14, //a[1][0][1] 0xbfd3d244
15, //a[1][0][2] 0xbfd3d248
16 //a[1][0][3] 0xbfd3d24c
},
{ //a[1][1]
17, //a[1][1][0] 0xbfd3d250
18, //a[1][1][1] 0xbfd3d254
19, //a[1][1][2] 0xbfd3d258
20 //a[1][1][3] 0xbfd3d25c
},
{ //a[1][2]
21, //a[1][2][0] 0xbfd3d260
22, //a[1][2][1] 0xbfd3d264
23, //a[1][2][2] 0xbfd3d268
24 //a[1][2][3] 0xbfd3d26c~0xbfd3d26f
} //下一个就是0xbfd3d270
}
};
for(i=0; i<2; i++)
{
for(j=0; j<3; j++)
{
for(k=0; k<4; k++)
{
printf("a[%d][%d][%d]:%p\n",i,j,k,&a[i][j][k]);
}
}
}
printf("a[1][2][3]:%p\n",&a[i-1][j-1][k-1]+1); //打印a[1][2][3]元素的尾地址的下一个地址0xbfd3d270.
printf("\na = %p\n",a); //a表示数组a[2]首元素a[0]的首地址
printf("a+1 = %p\n\n",a+1); //表示数组a[2]第二个元素a[1]的首地址
int (*p0)[3][4] = a; //a[0]中有三个元素,每个元素又有4个元素,所以对应数组[3][4]
printf("p0 = %p\n",p0); //p0是指向a[0]或a[1]类型的
p0 = &a[0]; //赋值没问题,说明类型一致,值相同所以就说明a就是
//首元素a[0]首地址,a和&a[0]都指向元素a[0]
printf("p0 = %p\n\n",p0);
printf("p0+1 = %p\n\n",p0+1); //p0+1就指向a[1]了.
int (*p)[2][3][4] = &a; //取a的地址就相当于整个三维数组的首地址
printf("p = %p\n", p);
printf("p+1 = %p\n\n", p+1); //加1就相当于指针跑到a[1][2][3]地址的后面,超过了数组越界了.
int *p1 = a[0][0]; //a[0][0]是首元素a[0][0][0]的首地址.指向a[0][0][0]
int *p2 = a[1][0]; //a[1][0]是首元素a[1][0][0]的首地址.指向a[1][0][0]
printf("p1 = %p\n", p1);
printf("p1+1 = %p\n", p1+1); //+1 指向a[0][0][1]
printf("p1+3 = %p\n\n", p1+3); //+3 指向a[0][0][3]
printf("p2 = %p\n", p2); //a[1][0]是首元素a[1][0][0]的首地址.指向a[1][0][0]
printf("*p1 = %d\n", *p1);
printf("*p2 = %d\n", *p2);
printf("*(p1+19) = %d\n", *(p1+19)); //从a[0][0][0]开始数19个元素,得到a[1][1][3]
printf("*(p2+2) = %d\n", *(p2+2)); //从a[1][0][0]开始数2个元素,得到a[1][0][2]
printf("*(a[0][0]+18) = %d\n", *(a[0][0]+18)); //从a[0][0][0]开始数18个元素,得到a[1][1][2]
int (*p3)[4] = &a[0][0]; //p3是指向元素a[0][0],它包含4个int的元素
printf("p3 = %p\n", p3);
printf("p3+3 = %p\n", p3+3); //+3等于向下移动3*4个int那么多个地址,所以指向a[1][0]
printf("a[1][2][2]=%d\n",a[1][2][2]);
printf("a[1][2][3]=%d\n",a[1][2][3]);
/* int a[2][6] = { {1,2,3,4,5,6} , {7,8,9,10,11,12} };
int (*p)[6];
p = a;
p = &a[0];
printf("a[2][6] = { {1,2,3,4,5,6} , {7,8,9,10,11,12} }\n");
printf("a[0][3]=%d *(*(p+0)+3)\n", *(*(p+0)+3));
printf("a[1][3]=%d *(*(p+1)+3)\n", *(*(p+1)+3));
printf("p+0=%p *(p+0)\n", *(p+0));
printf("p+1=%p *(p+1)\n", *(p+1));
int *p1 = a[0];
int *p2 = &a[0][0]; //a[0]等同于&a[0][0]
printf("a[0][3]=%d *(p2+6)\n", *(p2+6));
printf("a[0]+2=%d *(a[0]+2)\n", *(a[0]+2));
int *p3 = a[1];
printf("a[1][2]=%d *(p3+2)\n", *(p3+2));
*/
return 0;
}
注: 模型图片的地址不是同一次编译的,所以和运行结果不同,但元素之间相差的地址是一样的.