c++ - 通过c中的指针传递二维数组时出错

标签 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]’ `

最佳答案

虽然一维数组可以转换为指针(并且马上就会转换),但二维数组不会转换为指向指针的指针。

问题在于,在函数内部,编译器需要知道(至少)数组的宽度,以便根据您提供的二维坐标计算内存地址。因此,您至少需要明确指定一个维度。更一般地,给定一个 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++ - 通过c中的指针传递二维数组时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19010721/

相关文章:

c++ - 如何使用 regex_replace?

c++ - STL 顺序容器支持 insert (before) 而 forward_list 支持 insert_after

c++ - C++ 中的 volatile unsigned *

java - 如何将 C 代码转换为 Java - Java 中的等效指针

c - 为什么这会提前停止运行?

C - 如何 (*(void (*)()) 代码);在没有任何调用的情况下在 C 程序中运行

function - 将 varargin 解包为单个变量

c++ - 调整 QGLWidget 的大小以适应我拥有的每个 Sprite 大小

javascript - 'this' 和普通变量声明的区别

php - 在 PHP 中使用数组类类型参数