通过c中的指针传递2d数组时出错

时间:2013-09-25 16:45:35

标签: c++ c function pointers

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

`#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]’ `

3 个答案:

答案 0 :(得分:3)

虽然一维数组可以转换为一个指针(并且会在一顶帽子处),但二维数组不会转换为一个指向指针的指针。

问题是在函数内部,编译器需要知道(至少)数组的宽度,以根据您给出的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]; }
};

答案 1 :(得分:2)

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

有关更详细的说明,请参阅C FAQ

答案 2 :(得分:1)

第一个参数adisplay()的类型为int[3][4]无法转换为int**,因为正如您的编译器所说的那样'兼容类型。

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

迂腐地说,C(和C ++)中没有像二维数组那样 - a int[3][4]类型实际数组数组,所以它可以转换为指向数组第一个元素的指针 - 第一个元素的类型是int[4],因此第一个元素的指针变为int(*)[4]。就像类型int[100]的数组可以转换为int*(它是指向第一个元素的指针)。