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

标签 c++ c

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

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

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

关于c++ - 双指针可以用作二维数组吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68251484/

相关文章:

c++ - 操作数类型不兼容 ("char"和 "const char*")

c++ - 如何在 C++ 中设置带参数的功能宏?

c - 用 0 填充字符串的 printf

c++ - 如何在对基类和派生类进行操作时返回派生类型?

c++ - 与 XBoard(国际象棋引擎)通信(C++/C)

c - SSE 未对齐负载内在是否比 x64_64 Intel CPU 上的对齐负载内在慢?

c - 多进程和多线程 C 服务器上的持久连接

python - 为 c/c++ 代码编写 ctypes 包装器的正确方法

c++ - Char数据类型输入问题

c++ - 如何在JNI中为C++创建的新线程继续调用java实例jobject