二维数组是一个双指针?
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