通过 C 中的指针传递 2D 数组时出错

error while passing a 2d array through pointer in c

本文关键字:2D 数组 出错 指针 通过      更新时间:2023-10-16

编译以下程序时出错,谁能告诉我为什么编译器会给出这样的错误?

`#include <stdio.h>
void display(int **,int,int);
int main ()
{
int a[3][4]={1,2,3,4,5,6,7,8,9,0,1,6};
display(a,3,4);

return 0;
}
void display(int **a,int b,int c){
}

编译时出错

 ` ptr.c: In function ‘main’:
  ptr.c:6:1: warning: passing argument 1 of ‘display’ from incompatible pointer type [enabled by default]
  ptr.c:2:6: note: expected ‘int **’ but argument is of type ‘int (*)[4]’ `

尽管 1D 数组可以转换为指针(并且会在帽子掉落时转换),但 2D 数组不会转换为指向指针的指针。

问题在于,在函数内部,编译器需要知道(至少)数组的宽度,以便根据您给它的 2D 坐标计算内存地址。因此,需要至少显式指定一个维度。更一般地说,给定一个 N 维数组,您需要指定除第一个坐标之外的所有坐标。

由于您使用的是C++,因此几乎可以肯定的是,在内部存储数组宽度的std::vector周围使用一个小包装器会更好、更干净,这样您就可以传递它并轻松操作它。

template <class T>
class matrix { 
    size_t columns_;
    std::vector<T> data;
public:
    matrix(size_t columns, size_t rows) : columns_(columns), data(columns*rows) {}
    T &operator()(size_t column, size_t row) { return data[row*columns_+column]; }
};

数组不是指针。 在某些上下文中,数组衰减为指向其第一个元素的指针,但仅在第一级 - 数组数组衰减为指向数组的指针,而不是指向指针的指针。 不会以递归方式应用该规则。

有关更详细的说明,请参阅 C 常见问题解答。

display() a的第一个参数属于无法转换为int**int[3][4]类型,因为正如编译器所说,它们是兼容的类型。

但是,int[3][4]可以转换为 int(*)[4] .因此,您将显示的第一个参数从int**a更改为int (*a)[4],然后它将正常工作。

从学究上讲,在 C(和 C++)中没有比双维数组更像的了——a 的类型是 int[3][4] 实际上是一个数组数组,所以它可以转换为指向数组第一个元素的指针——第一个元素的类型是 int[4] 的,所以指向第一个元素的指针变成了int(*)[4]。就像 int[100] 类型的数组可以转换为 int*(这是指向第一个元素的指针)。