数组指针声明中&的使用疑问:二维数组为何出现类型不兼容错误
二维数组指针的类型匹配问题
先看一维数组的正确逻辑
一维数组int arr[3]的类型是int[3],取地址&arr得到的是指向int[3]类型的指针(即int (*)[3]),和你声明的指针p类型完全匹配,所以代码能正常编译。
二维数组的问题根源
二维数组int arr[3][3]的类型是int[3][3],取地址&arr得到的是指向int[3][3]类型的指针(即int (*)[3][3]),但你声明的p是int (*)[3]——这两个类型完全不兼容,所以编译器会抛出类型不匹配的错误。
两种正确的写法
指向整个二维数组的指针
如果你的需求是声明一个指向整个3×3二维数组的指针,需要把指针类型改成int (*)[3][3]:int arr[3][3] = {{12,10,45}, {44,55,66}, {79,85,91}}; int (*p)[3][3] = &arr;访问元素时用
(*p)[i][j],比如(*p)[0][1]就能取到10。指向二维数组中一维子数组的指针(更常用)
如果只是想遍历二维数组的子数组,直接用数组名赋值即可——二维数组名arr会隐式转换为指向第一个一维子数组的指针,类型正好是int (*)[3]:int arr[3][3] = {{12,10,45}, {44,55,66}, {79,85,91}}; int (*p)[3] = arr;访问元素可以直接用
p[i][j],和arr[i][j]效果完全一致,比如p[1][2]能取到66。
内容的提问来源于stack exchange,提问作者Talete
相关产品推荐
相关产品推荐

