c语言中,怎么可能将数组指针这样赋值?int (*p)[3]=&a[0][0]

int a[2][3] = {1,2,3,4,5,6};
int (*p)[3] = &a[0][0];//怎么能这样赋值呢?应该是int * p = &a[0][0]; 啊
上面的这个数组指针的赋值,我在vs2012里编译出错
这是怎么回事呢?

这是在视频中的截图,编译通过,运行正常,输出正常的数组元素值。
这是怎么回事呢?
在vs2012里,完全按照上面的这个代码敲出来。
编译出错,提示:“初始化”: 无法从“int *”转换为“int (*)[2][3]”
那为什么视频中的就可以运行呢?
最新回答
回首尽独你

2024-11-24 07:40:55

p是数组指针,指向的是一个3元素数组的地址,a[2][3]可以看做两个3元素数组,int (*p)[3] = &a[0][0];这种写法是声明即赋值,表示将a二维数组的首地址赋给p这样p就能够完整的访问a数组了
追问
int (*p)[3] = &a[0][0];如果这个是正确的
int * p1 = &a[0][0];//那为什么这个也可以赋值成功呢?
int (*p)[3]是int (*) []类型的数组指针
int * p1是int *类型的指针
为什么同一个类型的地址&a[0][0]可以赋给2个不同类型的指针呢?
追答
赋值当然是可以的,它本身是指针,可以接受任何地址,只要符合规则就是可以的。但是赋值之后是否能够按照你的逻辑进行就是你需要思考的问题了
追问
int (*p)[3] = &a[0][0];
//类型不同的指针可以随便赋值的吗?那这段代码在C++头文件下编译就出错,提示: “初始化”: 无法从“int *”转换为“int (*)[2]”,这又是为什么呢?
追答
int (*p)[3] = &a[0];