双指针可以用作二维数组吗
假设我有一个二维数组 - int Array[2][2]; 我知道我可以实现一个包含 4 个元素的数组,每行 2 个元素 [1 行构成一个数组]。我想知道 **Arr - 指向指针的指针是否可以用作二维数组。
回答
注意:此答案仅与 C 标记相关。在 C++ 中,它是不同的,也是你很少(几乎从不)做的事情。
我想知道 **Arr - 指向指针的指针是否可以用作二维数组。
是的,它被称为锯齿状数组。你这样做:
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),这很好。