int main()
{
matrix[2][4] = {{11,22,33,99},{44,55,66,110}};
int **ptr = (int**)matrix;
printf("%d%d",**matrix,*ptr);
}
但是当二维数组作为参数传递时,它会被类型转换为 (*matrix)[2] .. 编译器将该数组存储为什么类型...它存储为二维数组或双指针还是指向数组的指针..如果它存储为数组,那么在上面的不同情况下它的解释有何不同。请帮我理解。
最佳答案
Is 2d array a double pointer?
没有。您的程序的这一行不正确:
int **ptr = (int**)matrix;
This answer deals with the same topic
如果您想要具体了解多维数组是如何实现的:
多维数组的规则与普通数组没有什么不同,只是将“内部”数组类型替换为元素类型。数组项直接存储在内存中:
matrix: 11 22 33 99 44 55 66 110
----------- the first element of matrix
------------ the second element of matrix
因此,要寻址元素matrix[x][y]
,您需要矩阵的基地址 + x*4 + y
(4 是内部数组大小)。
当数组传递给函数时,它们会衰减为指向其第一个元素的指针。正如您所注意到的,这将是 int (*)[4]
。然后类型中的 4
会告诉编译器内部类型的大小,这就是它起作用的原因。当对类似的指针进行指针算术时,编译器会添加元素大小的倍数,因此对于matrix_ptr[x][y]
,您会得到matrix_ptr + x*4 + y
,与上面完全相同。
因此,转换 ptr=(int**)matrix
是不正确的。这一次,*ptr
意味着存储在矩阵地址处的指针值,但实际上并没有。其次,程序内存中的任何位置都没有指向matrix[1]
的指针。
注意:本文中的计算假设 sizeof(int)==1
,以避免不必要的复杂性。
关于c - 二维数组是双指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38517706/