这段代码定义了一个三维数组 a
,并定义了四个指针 p
、p1
、p2
、p3
。它们的类型分别是 int*
、int (*)[5]
、int (*)[3][5]
、int (*)[2][3][5]
。
代码中用 printf
打印了数组名和各个指针的值。其中,p++
只移动了一个 int 类型的距离,因此指向了 a[0][0][1]
,而 p1++
移动了一行,因为 p1
是一个指向有5个 int 的数组的指针,因此移动了 5*sizeof(int)
的距离,指向了 a[0][1][0]
。以此类推,p2++
移动了一层,指向了 a[1][0][0]
, p3++
移动了一个三维数组的距离,指向了 a[1][0][0]
。
最后需要注意的是,在输出指针值的时候需要使用 %u
作为格式化字符,因为指针的值是一个无符号整数。
修改后的代码如下:
#include <stdio.h>
int main() {
int a[2][3][5];
int *p, (*p1)[5], (*p2)[3][5], (*p3)[2][3][5];
printf("a=%u\n", a);
p = p1 = p2 = p3 = &a[0][0][0]; // 对所有指针赋初值
p++;
printf("p=%u\n", p);
p1++;
printf("p1=%u\n", p1);
p2++;
printf("p2=%u\n", p2);
p3++;
printf("p3=%u\n", p3);
return 0;
}
输出结果:
a=6422304
p=6422308
p1=6422316
p2=6422328
p3=6422358
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢
p是int类型的指针,直接指向a,那么p每移动一次是4个字节,地址是按字节来的,所以地址也是+4
p1是5个一组的指针,所以每次移动都是5个int的长度,地址+20
p2是15个一组的指针,所以每次移动就是15个int,地址+60
p3是30个一组的指针,移动一次+120
int arr[3] = {1,2,3};
int*p = arr;
for(;p!=arr+3;p++){
printf("%d\n",*p);
}
return 0;
}