【问题标题】:error while passing a 2d array through pointer in c通过c中的指针传递二维数组时出错
【发布时间】:2013-09-25 16:45:35
【问题描述】:

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

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

【问题讨论】:

  • 警告不是错误,数组不是指针
  • 这种二维数组存储在单个平坦的内存区域中,因此它无法转换为指向指针的指针。

标签: c++ c function pointers


【解决方案1】:

虽然 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]; }
};

【讨论】:

    【解决方案2】:

    数组不是指针。在某些情况下,数组衰减为指向其第一个元素的指针,但仅在第一层——数组数组衰减为指向数组的指针,但不会衰减为指向数组的指针指向指针的指针。该规则不会递归应用。

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

    【讨论】:

      【解决方案3】:

      adisplay() 的第一个参数是int[3][4] 类型,不能转换成int**,因为正如编译器所说,它们是兼容的类型。

      但是,int[3][4] 可以转换为 int(*)[4]。所以你把display的第一个参数int**a改成int (*a)[4],就可以正常工作了。

      从迂腐的角度来说,C(和 C++)中没有像二维数组那样的东西——a 的类型为 int[3][4]实际上是一个数组数组,所以它可以转换成指向数组第一个元素的指针——第一个元素的类型是int[4],所以指向第一个元素的指针变成了int(*)[4]。就像int[100] 类型的数组可以转换为int*(即指向第一个元素的指针)。

      【讨论】:

        猜你喜欢
        • 2014-07-29
        • 1970-01-01
        • 2013-05-19
        • 1970-01-01
        • 2020-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-13
        相关资源
        最近更新 更多