【发布时间】:2022-01-13 04:23:03
【问题描述】:
我的老师告诉我 int **array 不是二维数组,它只是一个指向整数的指针。 现在,在我的一个项目中,我必须动态分配一个二维结构数组,这就是它的完成方式:
struct cell **array2d = (struct x **)calloc(rows, sizeof(struct x *));
for (int i = 0; i < columns; i++) {
array2d[i] = (struct x *)calloc(j, sizeof(struct x));
}
但是这里我们返回一个指向结构体的指针,那么这怎么是一个二维数组呢?
在使用动态分配之前,我有一个静态分配的数组,格式如下: 数组2d[][]
现在我用动态分配代替了它,我也用 **array2d 代替了 array2d[][]。
每个接受 array2d[i][j] als 参数的函数现在都会返回一个错误,指出类型不匹配。
谁能解释一下这里发生了什么? **array 和 array[m][n] 有什么区别,为什么编译器会报错?
【问题讨论】:
-
首先,C 没有“2D”数组。它确实有嵌套数组,数组的数组,不幸的是,它们经常被称为多维数组。其次,数组数组不与指向指针的指针(有时也称为jagged array)相同。参见例如this old answer of mine 以某种方式直观地表示差异。
-
为了帮助您更好地理解事物,您需要了解两件事:1) 所有数组(正确的数组)都可以衰减指向它的第一个指针元素。所以如果我们有例如
int array[X];然后使用普通的array与&array[0]相同,类型为int *;并且 2) 对于任何数组或指针p和索引i,表达式p[i]恰好等于*(p + i),这意味着所有“数组" 索引实际上是指针算法。这两件事有时会使数组和指针看起来很相似。 -
两者兼有,取决于您询问的对象。二维数组是一种抽象。它只存在于人们的脑海中(细节因人而异)。它不是一种语言结构。无论如何,不在 C 中。
int **array和int array[m][n]可能会或可能不会在某种程度上实现您首选的抽象。但就 C 而言,它们是不同的、不兼容的东西。 -
for (int i = 0; i < i; i++) {- 您预计i何时小于i?这个循环会运行吗?鉴于i出现在循环之前,看起来您的列表本地范围内的i正在遮蔽外部范围内的i。 -
@Chris 我修复了它以使示例更清晰。
标签: c pointers dynamic-memory-allocation