gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:58:50 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com