如何将二维数组的引用传递给函数?

27

我想在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

这个错误是什么意思,我该如何修复它?

5个回答

38

如果您在编译时知道大小,可以使用以下方法:

//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]),因此仅是指针的大小。


23

虽然你可以传递一个数组的引用,因为当数组不绑定到引用参数时,在函数调用中它们会衰减为指针,并且你可以像使用数组一样使用指针,但更常见的是在函数调用中像这样使用数组:

void ModifyArray( int arr[][80] ); 
或者等价地。
void ModifyArray( int (*arr)[80] );

在函数内部,可以像函数声明一样使用 arr:

void ModifyArray( int (&arr)[80][80] );
唯一不适用于上述情况的情况是被调用的函数需要对第一个数组索引的大小进行静态检查保证。

7

您可能想尝试使用 cdeclc++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

2

语法不正确。

让我们以一维数组为例:

 int a[] = {1,2,3};
 int (&p) [3] = a; // p is pointing array a 

您可以像下面展示的那样对二维数组执行相同的操作

const int board_width = 80;
const int board_height = 80;
void do_something(int (&array) [board_width][board_height]); 

-1

我认为这就是你想要的:

void do_something(int array[board_width][board_height]);

你不能将一个引用数组作为参数传递给函数。


1
与最佳答案相矛盾 - Sriram Murali
3
你不能把引用数组传递给函数。但是你可以传递一个数组的引用。 - R Sahu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接