0

可能重复:
如何在 C++ 中使用数组?

如何通过指针将二维数组传递给 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);   //????
}
4

5 回答 5

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给一个函数,它需要知道它必须增加aptr3 * sizeof(a)才能访问a[1][0]

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

于 2012-10-13T16:50:18.563 回答
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];
}
于 2012-10-13T16:47:57.043 回答
0

您需要将 fn() 声明为

void fn(int (&a)[10][10])
于 2012-10-13T15:58:52.507 回答
0

C++ 需要知道数组大小(一维)来执行二维索引。

尝试:

void fn(int a[][10]) {
    cout<<a[0][0]<<" "<<a[0][1]; 
}
于 2012-10-13T16:03:47.763 回答
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);
}
于 2012-10-13T16:48:30.913 回答