2d数组是双指针吗?

2d数组是双指针吗?

int main(){
    matrix[2][4] = {{11,22,33,99},{44,55,66,110}};
    int **ptr = (int**)matrix;
    printf("%d%d",**matrix,*ptr);}

但是,当二维数组作为参数传递时,它被输入到(*矩阵)[2]中。编译器将这个数组存储为.它是存储为二维数组还是双指针或指向数组的指针。如果它是作为数组存储的,那么在上面这样的不同情况下,它是如何进行不同的解释的。请帮我理解。


尚方宝剑之说
浏览 443回答 3
3回答

料青山看我应如是

2d数组是双指针吗?没有。程序的这一行不正确:int **ptr = (int**)matrix;这个答案涉及同一个话题。如果您想要具体的图像,那么多维数组是如何实现的:多维数组的规则与普通数组没有什么不同,只是将“内部”数组类型替换为元素类型。数组项彼此直接存储在内存中:matrix: 11 22 33 99 44 55 66 110         -----------               the first element of matrix                    ------------  the second element of matrix因此,要处理元素matrix[x][y],你带着the base address of matrix + 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,以避免不必要的复杂性。

沧海一幻觉

没有。多维数组是单个内存块。块的大小是维度的乘积,乘以元素类型的大小,并在每对括号中对其余维度的尺寸乘积将偏移值索引到数组中。所以.。int arr[5][3][2];是一个包含30的数组。intS.arr[0][0][0]给出第一个,arr[1][0][0]给出第七(偏移3*2)。arr[0][1][0]给出第三个(偏移2)。数组衰减到的指针将取决于级别;arr衰变到指向3x2 int数组的指针,arr[0]衰变到指向2元素int数组的指针,arr[0][0]衰减到指向int的指针。但是,您也可以拥有一个指针数组,并将其视为一个多维数组-但它需要一些额外的设置,因为您必须将每个指针设置为其数组。此外,您将丢失有关数组中数组大小的信息(sizeof会给出指针的大小)。另一方面,您可以拥有不同大小的子数组,并更改指针指向的位置,这对于需要重新调整大小或重新排列非常有用。这样的指针数组可以像多维数组一样进行索引,尽管它的分配和排列方式不同,sizeof不会总是以同样的方式对待它。静态分配此设置的示例如下:int *arr[3];int aa[2] = { 10, 11 },      ab[2] = { 12, 13 },      ac[2] = { 14, 15 };arr[0] = aa;arr[1] = ab;arr[2] = ac;在这之后,arr[1][0]是12..但是没有给int发现于1 * 2 * sizeof(int)数组开始地址的字节数。arr,它给了int发现于0 * sizeof(int)所指向的地址的字节数。arr[1]..还有,sizeof(arr[0])等于sizeof(int *)而不是sizeof(int) * 2.

摇曳的蔷薇

在C语言中,没有什么特别的东西需要你去理解多维数组。他们的工作方式完全一样,就好像他们从来没有被特别提到过一样。您需要知道的是,您可以创建任何类型的数组,包括数组。所以当你看到:[2][4];想想看,“matrix是一个由两个事物组成的数组-这些东西是由4个整数组成的数组“。适用于数组的所有正常规则。例如,matrix可以很容易地衰减为指向其第一个成员的指针,就像任何其他数组一样,在这种情况下,这是一个由四个整数组成的数组。(当然,它本身也会腐烂。)
打开App,查看更多内容
随时随地看视频慕课网APP