c - 二维数组是双指针吗?

标签 c multidimensional-array

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/

相关文章:

c# 检测后台是否按下某个键

c - 作为变量和值传递的参数,都返回不同的答案

php - array_push 多维数组中的某处

JavaScript - 操作对象的嵌套多维数组

php - 移动多维数组的元素

c++ - 在二维 std::vector 中设置元素

c - C 中的本地 int 与 Global int

c - 用 C 程序替换 pipe-shellscript

c - fchmod() 无法在 C 中正确应用文件权限

c# - 我在 C# 中有一个 2d (n x n) 字符串数组,如何将它动态地输出到网页(尝试过数据表/绑定(bind)等...)