问题描述
#include "stdio.h"
int main(){
int D[2][3][3] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18};
printf("D: %p\n",D);
printf("*(0x0061FEC8): %d\n",*((int *)(0x0061FEC8)));
printf("*D: %p\n",*D);
return 0;
}
D: 0061FEC8
*(0x0061FEC8): 1
*D: 0061FEC8
p.s:通过多次运行该代码,我获得了地址0x0061FEC8,并看到它没有变化。由于不允许取消引用整数,因此我也将其强制转换为整数指针。
好的,我从几个资料中读到,除了&和sizeof运算符这两个例外,多维数组的名称会衰减为指向该连续内存块第一个元素的指针。 因此,如果3d数组名称D衰减到指向第一个元素的指针中,为什么第二行和第三行的输出不同? D应该衰减到地址0x0061FEC8中,并取消引用该地址应我认为值1。但是,它会再次打印地址。
解决方法
当您执行*((int *)(0x0061FEC8))
时,会将该位置的地址视为指向 1D 数组的第一个元素的指针。取消引用该指针时,将在该位置获得值。
但是,当您执行*D
时,它与类型为D[0]
的{{1}}相同。它将衰减为指向int [3][3]
类型的D[0][0]
指针。即int (*)[3]
不是值。
因此,这两个表达式执行两项非常不同的操作。一个(第一个)是错误的,第二个是正确的。