假设我有一个二维数组 - int Array[2][2];我知道我可以实现一个有 4 个元素的数组,每行有 2 个元素 [1 行构成一个数组]。我想知道 **Arr - 指向指针的指针是否可以用作二维数组。
最佳答案
注意:此答案仅与 C 标签相关。在 C++ 中,这是不同的,也是您很少(几乎从不)做的事情。
I want to know if **Arr - A pointer to a pointer can be used as a 2D array.
是的,它叫做锯齿状数组。你这样做:
int rows = 2;
int cols = 2;
int** arr = malloc(rows * sizeof *arr);
for (int i=0; i<rows; ++i)
{
arr[i] = malloc(cols * sizeof *arr[i]);
}
现在您可以访问,例如arr[1][0]
完成数组后,您需要释放它。这是您的 malloc
的“反向”操作。喜欢:
for (int i=0; i<rows; ++i)
{
free(arr[i]);
}
free(arr);
另一种方法是使用指向 cols
int
数组的指针。喜欢
int (*arr)[cols] = malloc(rows * sizeof *arr);
... use arr, e.g. arr[1][0] = 42; ...
free(arr);
第二个代码的好处是它更简单(更少的代码,更少的 malloc
和 free
调用导致更好的性能)。
锯齿状数组适用于行中需要可变列数的情况。例如,如果某些行只需要 10 个整数而其他行需要 10.000 个整数,您可以通过仅分配特定行实际需要的列数(而不是始终为所有行分配 MAX 列数)来节省内存。此外,如果您需要在运行时更改列数(例如使用 realloc
),这很好。
关于c++ - 双指针可以用作二维数组吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68251484/