双指针可以用作二维数组吗

假设我有一个二维数组 - 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);

第二个代码的好处是它更简单(更少的代码,更少的调用mallocfree导致更好的性能)。

在行中需要可变数量的列的情况下,锯齿状数组非常有用。例如,如果某些行只需要 10 个整数而其他行需要 10.000 个整数,则可以通过仅分配特定行实际需要的列数(而不是始终为所有行分配 MAX 列数)来节省内存。此外,如果您需要在运行时更改列数(例如使用realloc),这很好。


以上是双指针可以用作二维数组吗的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>