定义二维数组:int *arr[ ] 和 int arr[ ][ ] 就它们在内存中的表示方式而言有什么区别?

Red*_*hun 1 c pointers multidimensional-array implicit-conversion function-declaration

我一直在尝试理解这两个定义之间的区别以及如何正确使用它们。
在我看来,定义一个二维数组将arr[length][width]矩阵的内容一行一行地连续存储在内存中(矩阵本质上是一大行),这样您就可以用这种方式访问​​ i,j 坐标中的数字*(arr+width*i+j): 。当将其发送到函数时,可以进行声明,func(int *arr)并且由于二维数组在内存中的表示方式,您访问矩阵内容不会有问题。

而将数组定义为似乎int *arr[];并没有以相同的线性、连续的方式将矩阵的内容存储在内存中。函数的声明必须是func(int **arr) or (int *arr[])。虽然您仍然可以通过坐标 i, j 访问矩阵,如下所示:arr[i][j],但似乎不可能这样做:*(arr+width*i+j)。我的想法是否正确,因为以这种方式定义二维矩阵不会将矩阵的行连续存储在内存中,还是我遗漏了一些东西?

use*_*751 5

这声明了一个二维数组:

int arr1[100][200];
Run Code Online (Sandbox Code Playgroud)

这声明了一个一维指针数组:

int *arr2[100];
Run Code Online (Sandbox Code Playgroud)

它们不是同一件事。arr1 包含 20000 个整数,arr2 包含 100 个指针。

arr1[20][30]会计算出第21行第31列的地址并直接转到那里。arr2[20][30] 将计算第 21 个指针的地址,读取指针,计算距指针指向的位置 30 个整数的地址(如果它指向一个整数数组,则为第 31 个整数),然后转到那里。

如果愿意,您可以为 20000 个整数分配空间,并且可以在 arr2 中保存指向每一行的指针。然后两者都可用于在行和列中存储数字。

arr2 的优点是,因为每一行都有一个指向实际数据的指针,所以可以有不同大小的行、重叠的行或缺失的行。在 arr1 中,行的长度正好是 200 个整数,无一例外。arr2 的缺点是计算机必须做更多它实际上不需要做的工作,即速度较慢。arr2 的另一个缺点是你仍然必须有一个地方来放置整数,所以如果你的问题是找到一个地方来放置整数,那么 arr2 实际上并不能解决这个问题。