为什么编译器不能将int [] []转换为int**,这在理论上是可行的?

Str*_*rin -2 c

在C中,二维数组的存储方式与线性数组一样,但它们使用双指针进行索引.也就是说,如果我们定义

int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}}.
Run Code Online (Sandbox Code Playgroud)

a 首先指向类似的东西

{p1 = 0x7fff5fbffb58 , p2 = 0x7fff5fbffb70, p3 = 0x7fff5fbffb88}
Run Code Online (Sandbox Code Playgroud)

然后p1指向1,p2指向4并p3指向7.

那么为什么编译器不允许从二维数组转换为双指针,这在理论上是可行的?尽管二维数组是逐个存储的,但索引信息总是可以传递给任意双指针.

asa*_*elr 9

这在理论上是不可能的.不使用双指针索引2d数组 - 编译器将其转换为一个索引.例如,如果您有int a[3][5],并且您访问a[i][j],则编译器将其转换为((int[])a)[5*i+j].(你的解释完全错了)

由于所有这些,如果要转换int[][]int**,则需要分配内存以保存所有子阵列的地址,并获取其地址.只是(int**)a不会工作.