Ang*_*gus 37 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);
}
Run Code Online (Sandbox Code Playgroud)
但是当一个2-d数组作为参数传递时,它被转换为(*matrix)[2] ..编译器将这个数组存储为什么类型...是存储为2-d数组还是双指针或指向数组的指针.如果它作为数组存储,它如何在不同的情况下如上所述进行不同的解释.请帮我理解.
jpa*_*cek 40
2d数组是双指针吗?
不.你的程序这一行不正确:
int **ptr = (int**)matrix;
Run Code Online (Sandbox Code Playgroud)
如果您想要具体的图像如何实现多维数组:
多维数组的规则与普通数组的规则没有什么不同,只是将"内部"数组类型替换为元素类型.数组项直接相继存储在内存中:
matrix: 11 22 33 99 44 55 66 110
----------- the first element of matrix
------------ the second element of matrix
Run Code Online (Sandbox Code Playgroud)
因此,为了解决元件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为避免不必要的复杂性.
Dmi*_*tri 10
不可以.多维数组是单个内存块.块的大小是尺寸乘以元素类型的大小的乘积,并且每对括号中的索引通过剩余尺寸的尺寸的乘积偏移到阵列中.所以..
int arr[5][3][2];
Run Code Online (Sandbox Code Playgroud)
是一个持有30 int秒的数组. 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;
Run Code Online (Sandbox Code Playgroud)
以上之后,arr[1][0]是12.而是让该int发现在1 * 2 * sizeof(int)过去的数组的起始地址字节arr,它提供了int在发现0 * sizeof(int)字节过去指向的地址arr[1].而且,sizeof(arr[0])相当于sizeof(int *)代替sizeof(int) * 2.