【发布时间】:2025-12-23 11:45:06
【问题描述】:
我的理解是,如果一个人在本地声明一个二维数组:int 2darr[x][y],它不是一个指针数组,其中每个指针都指向自己的一维数组,而是处理器在其上执行的一维数组*(2darr + (row x nCols) + col) 类型的指针算法。
在这种情况下,语法糖 2darr[row][col] 背后的指针算法是有意义的,因为我们的二维数组实际上只是一个大小为 nRows x nCols 的连续内存块。
然而,动态分配二维数组的一种方法是首先分配一个大小为nRows 的指针数组,然后为每个指针分配一个大小为nCols 的任意类型的数组。在这种情况下,我们的行不一定会连续存储在内存中。每一行都可以存储在内存中完全不同的位置,我们的指针数组中的一个指针指向它的第一个元素。
鉴于此,我不明白我们如何仍然可以通过 2darr[row][col] 访问二维数组中的数据。由于不能保证我们的行是连续存储的,所以 *(2darr + (row x nCols) + col) 类型的指针算法根本不应该保证工作。
【问题讨论】:
-
编译器将根据声明生成正确的访问算法。
int 2darr[x][y]与int (*2darr)[y]不同。关于指针和数组等价的各种介绍让很多人感到困惑,所以你不是第一个对此感到困惑的人;-)。连续的内存块是表示数组的更传统和更有效的方式。数组数组更灵活(例如,它允许不规则数组,其中不同的行可以有不同的长度)。 -
您遇到了 C 语言中一个奇怪的不一致之处。
-
答案似乎相当复杂。我认为最好这样看待:
int x[10][20]是一回事,指针数组是int ** y。下标运算符在数组和指针上的工作方式不同,我认为这是一个足够好的解释......
标签: c arrays pointers memory pointer-arithmetic