通过指针将2-D数组传递给c ++中的函数

时间:2012-10-13 15:48:03

标签: c++ pointers

  

可能重复:
  How do I use arrays in C++?

如何通过指针传递2-D数组以在c ++中运行。 我在尝试下面的代码时遇到以下错误。

错误:无法将参数'1'的'int(*)[10] [10]'转换为'int **'为'void fn(int **)'

void fn(int **a)
{
cout<<a[0][0]<<" "<<a[0][1];
}

int main()
{

int A[10][10];
A[0][0]=1;
A[0][1]=2;

fn(&A);   //????
}

5 个答案:

答案 0 :(得分:2)

以你的方式创建的二维数组在内存中是一个重点。编译器需要知道每个段的大小,以便能够将指针移动到函数中的下一个。写fn(int (*a)[3])fn(int a[][3])是等效的。但是我们举一个例子

char a[3][3];

a[0][0] = 01;
a[0][1] = 02;
a[0][2] = 03;
a[1][0] = 04;
a[1][1] = 05;
a[1][2] = 06;
a[2][0] = 07;
a[2][1] = 08;
a[2][2] = 09;

将成为

|01|02|03|04|05|06|07|08|09|

在记忆中。

因此,如果您将a传递给某个函数,则需要知道必须将a ptr增加3 * sizeof(a)才能访问a[1][0]

简而言之:函数的原型需要是void fn(int a[][10])void fn(int (*a)[10])

答案 1 :(得分:1)

根据@R的链接。 Martinho Fernandes,以下是有效的C ++:

int array_of_arrays[6][7];
int (*pointer_to_array)[7] = array_of_arrays;

所以以下内容也应该有效:

void fn (int (*a)[10]) 
{
     cout<<a[0][0]<<" "<<a[0][1];
}

我相信以下内容也是有效的:

void fn (int a[][10]) 
{
    cout<<a[0][0]<<" "<<a[0][1];
}

答案 2 :(得分:0)

您需要将fn()声明为

void fn(int (&a)[10][10])

答案 3 :(得分:0)

C ++需要知道(一维)的数组大小才能执行2d索引。

尝试:

void fn(int a[][10]) {
    cout<<a[0][0]<<" "<<a[0][1]; 
}

答案 4 :(得分:0)

C ++中的数组可以被视为指向数组第一个元素位置的指针。二维数组可以被认为是指针数组,并且每个指针指向另一个数组。虽然这并不是严格说明如何实现数组,但C支持数组和指向第一个元素的指针之间的隐式转换,您可以将它们视为相同。 Array [index]只是*(Array + index*sizeof(whatever's in the array))的语法糖。因此,为了使您的功能正常工作,您可以这样做:

void fn(int (*a)[10]) {
    cout<<a[0][0]<<" "<<a[0][1];
}

int main() {

    int A[10][10];
    A[0][0]=1;
    A[0][1]=2;

    fn(A);
}

不需要先获取数组的地址,因为它已经是指针。但是,因为您使用的是C ++,所以您应该考虑使用标准容器:

void fn(vector< vector<int> > const&a) {
    cout<<a[0][0]<<" "<<a[0][1];
}

int main() {

    vector< vector<int> > A( 10, vector<int>(10) );
    A[0][0]=1;
    A[0][1]=2;

    fn(A);
}