我试图将二维数组的引用传递给C ++中的函数。我在编译时知道两个维度的大小。这就是我现在所拥有的:
const int board_width = 80;
const int board_height = 80;
void do_something(int[board_width][board_height]& array); //function prototype
但这不起作用。我从g ++中得到了这个错误:
error: expected ‘,’ or ‘...’ before ‘*’ token
此错误意味着什么,我该如何解决?
答案 0 :(得分:35)
如果您在编译时知道大小,就可以这样做:
//function prototype
void do_something(int (&array)[board_width][board_height]);
用
做void do_something(int array[board_width][board_height]);
实际上会将指针传递给二维数组的第一个子数组(“board_width”完全被忽略,就像当int array[]
接受指针时只有一个维度的退化情况一样),这可能不是你想要的(因为你明确要求参考)。因此,使用参数执行它,在参数sizeof array
上使用sizeof将产生sizeof(int[board_width][board_height])
(就好像您将在参数本身上执行它),同时使用第二种方法(将参数声明为数组) ,从而使编译器将其转换为指针)将产生sizeof(int(*)[board_height])
,因此只是指针的sizeof。
答案 1 :(得分:23)
虽然你可以传递对数组的引用,因为当数组没有绑定到引用参数时,数组会衰减到函数调用中的指针,并且你可以像数组一样使用指针,在函数调用中使用数组更常见这样:
void ModifyArray( int arr[][80] );
或等效
void ModifyArray( int (*arr)[80] );
在函数内部,arr的使用方式与函数声明的大致相同:
void ModifyArray( int (&arr)[80][80] );
唯一不支持的情况是被调用函数需要静态检查第一个数组索引大小的保证。
答案 2 :(得分:6)
您可能想尝试 cdecl 或 c ++ decl 。
% c++decl
c++decl> declare i as reference to array 8 of array 12 of int
int (&i)[8][12]
c++decl> explain int (&i)[8][12]
declare i as reference to array 8 of array 12 of int
c++decl> exit
答案 3 :(得分:1)
语法不正确。
让我们举一个数组
的例子 int a[] = {1,2,3};
int (&p) [3] = a; // p is pointing array a
所以你可以对2D数组做同样的事情,如下所示
const int board_width = 80;
const int board_height = 80;
void do_something(int (&array) [board_width][board_height]);
答案 4 :(得分:0)
我认为这就是你想要的:
void do_something(int array[board_width][board_height]);
您无法将一组引用传递给函数。