如何通过指针传递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); //????
}
答案 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);
}