二维数组是一个双指针?

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

但是,当一个二维数组作为parameter passing时,它将被types化(* matrix)[2] ..编译器将这个数组存储为什么types…是以二维数组还是双指针或者一个指向数组的指针。如果它以数组的forms存储,它在不同情况下如何解释不同。 请帮我理解。

二维数组是一个双指针?

不。你的程序的这一行是不正确的:

 int **ptr = (int**)matrix; 

这个答案处理相同的话题

如果你想要具体的图像如何实现multidimensional array:

multidimensional array的规则与普通数组的规则没有区别,只是将“内部”数组typesreplace为元素types。 数组项目被直接存储在内存中:

 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] 。 然后,types4将告诉编译器内部types的大小,这就是为什么它的工作原理。 当对指针进行指针运算时,编译器会添加多个元素大小,所以对于matrix_ptr[x][y] ,您得到了matrix_ptr + x*4 + y ,这与上面的完全一样。

因此铸造ptr=(int**)matrix是不正确的。 一次, *ptr将意味着存储在matrix地址的指针值,但是没有。 其次,在程序的内存中没有指向matrix[1]的指针。

注意:本文中的计算假设sizeof(int)==1 ,以避免不必要的复杂性。

不。multidimensional array是一块单一的内存。 块的大小是尺寸乘以元素types的大小的乘积,并且每对括号中的索引在数组中通过剩余维度的尺寸的乘积偏移到arrays中。 所以..

 int arr[5][3][2]; 

是一个包含30个int的数组。 arr[0][0][0]给出第一个, arr[1][0][0]给出第七个(偏移3 * 2)。 arr[0][1][0]给出第三个(偏移量2)。

arrays衰减的指针将取决于级别; arr衰减为指向3×2 int数组的指针, arr[0]衰减为指向2元素int数组的指针,arr [0] [0]衰减为指向int的指针。

但是,您也可以有一个指针数组,并将其视为一个multidimensional array – 但它需要一些额外的设置,因为您必须将每个指针设置为其数组。 此外,您将失去有关数组中的数组大小的信息( sizeof将给出指针的大小)。 另一方面,您可以获得具有不同大小的子数组的能力,并且可以更改指针指向的位置,如果需要resize或重新排列,这非常有用。 像这样的指针数组可以像multidimensional array一样被索引,尽pipe它的分配和排列方式不同, 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 。 但不是给出在1 * 2 * sizeof(int)字节处find的1 * 2 * sizeof(int)超出数组arr的起始地址,而是给出了在arr[1]指向的地址之后的0 * sizeof(int)字节处find的int 。 此外, sizeof(arr[0])等于sizeof(int *)而不是sizeof(int) * 2

在C中,理解multidimensional array没有什么特别的。 他们的工作方式完全一样,就像他们从未被特别提到过一样。 所有你需要知道的是你可以创build任何types的数组,包括一个数组。

所以当你看到:

int matrix [2] [4];

试想一下,“ matrix是2个数组的数组 – 这些数组是4个整数的数组”。 数组的所有常规规则都适用。 例如, matrix可以很容易地衰减到一个指向其第一个成员的指针,就像任何其他数组,在这种情况下,它是一个四个整数的数组。 (当然,这本身可能会衰败。)

如果你可以使用这个数据栈(小容量),那么你通常定义matrix:

 int matrix[X][Y] 

当你想在堆(大容量)分配它,你通常定义一个:

 int** matrix = NULL; 

然后用malloc / calloc分配这两个维度。 你可以把2d数组当作int **,但这不是一个好的做法,因为它使得代码更不可读。 除此之外

 **matrix == matrix[0][0] is true