通过引用传递int/char数组的错误/警告

通过引用传递int/char数组的错误/警告,c,arrays,pass-by-reference,C,Arrays,Pass By Reference,我正在编写一个程序,试图通过引用传递参数。我试图通过引用传递一个2D int数组和一个1D char数组 功能原型: void foo (int* (&a)[2][2], char* (&b)[4]) 函数调用: foo (a, b); 但是,当我在gcc上使用-ansi和-Wall标志编译代码时,我得到以下错误: foo.c: At top level: error: expected ‘)’ before ‘&’ token error: expected ‘;’

我正在编写一个程序,试图通过引用传递参数。我试图通过引用传递一个2D int数组和一个1D char数组

功能原型:

void foo (int* (&a)[2][2], char* (&b)[4])
函数调用:

foo (a, b);
但是,当我在gcc上使用
-ansi
-Wall
标志编译代码时,我得到以下错误:

foo.c: At top level:
error: expected ‘)’ before ‘&’ token
error: expected ‘;’, ‘,’ or ‘)’ before ‘char’
foo.c: In function ‘main’:
error: too many arguments to function ‘foo’
我已经剥离了程序的其余代码,并将注意力集中在抛出错误的位上。我在StackOverflow上搜索过,并尝试了不同的方法来传递参数,但似乎都不起作用。()


<>你能告诉我哪里出问题了吗?< /P> < P>引用不是C语言的一部分,你试图使用的语法只在C++中工作。 顺便提一下,
char*(&b)[4]
将是对四个
char*
的数组的引用,它是
char*
的一维数组,而不是
char
的一维数组

通常,采用
int
s的2d数组和
char
的1d数组的函数将声明为

void foo(int a[][2], char b[]);
这与:

void foo(int (*a)[2], char *b);

引用不是C语言的一部分,你试图使用的语法只在C++中工作。 顺便提一下,

char*(&b)[4]
将是对四个
char*
的数组的引用,它是
char*
的一维数组,而不是
char
的一维数组

通常,采用
int
s的2d数组和
char
的1d数组的函数将声明为

void foo(int a[][2], char b[]);
这与:

void foo(int (*a)[2], char *b);

首先,正如查尔斯所说,C没有参考文献。但通常情况下,您可以用指针替换引用,并通过稍微不同的语法获得相同的结果

其次,您的描述说您试图传递一个2D
int
数组,但您的声明表明它实际上是一个
int*
指针数组。那么,那应该是什么,一个
int
数组还是一个
int*
数组

假设您想要一个
int
数组(和
char
数组),那么带有指向数组的指针而不是数组的引用的变量可能如下所示

void foo(int (*a)[2][2], char (*b)[4]);
基本上与您使用的语法相同,但使用了
*
而不是
&
。在函数内部,数组元素将被访问为
(*a)[i][j]
(*b)[k]

此函数将被调用,如下所示

int a[2][2];
char b[4];
...
foo(&a, &b);

首先,正如查尔斯所说,C没有参考文献。但通常情况下,您可以用指针替换引用,并通过稍微不同的语法获得相同的结果

其次,您的描述说您试图传递一个2D
int
数组,但您的声明表明它实际上是一个
int*
指针数组。那么,那应该是什么,一个
int
数组还是一个
int*
数组

假设您想要一个
int
数组(和
char
数组),那么带有指向数组的指针而不是数组的引用的变量可能如下所示

void foo(int (*a)[2][2], char (*b)[4]);
基本上与您使用的语法相同,但使用了
*
而不是
&
。在函数内部,数组元素将被访问为
(*a)[i][j]
(*b)[k]

此函数将被调用,如下所示

int a[2][2];
char b[4];
...
foo(&a, &b);

所以…我不能在C中通过引用传递数组?不,在C中的任何上下文中都可以有引用。你也不能通过值传递数组;当传递给函数时,它们总是衰减为指向第一个元素的指针。在C中,它总是按值传递。阅读有关数组向指针衰减的更多信息。和@nvl:谢谢。更改功能原型确实使其工作。我不知道C中的数组正在衰退。@Ankur Banerjee:使用指向数组类型的指针(或/或在C++中引用数组类型)实际上是防止数组类型衰退的一种方法。所以,最终这是一个你的意图的问题,一个你是否希望你的数组类型衰减的问题。所以…我不能在C中通过引用传递数组?不,你可以在C中的任何上下文中使用引用。你也不能通过值传递数组;当传递给函数时,它们总是衰减为指向第一个元素的指针。在C中,它总是按值传递。阅读有关数组向指针衰减的更多信息。和@nvl:谢谢。更改功能原型确实使其工作。我不知道C中的数组正在衰退。@Ankur Banerjee:使用指向数组类型的指针(或/或在C++中引用数组类型)实际上是防止数组类型衰退的一种方法。所以,归根结底,这取决于你的意图,取决于你是否希望你的数组类型衰减。谢谢你,AndreyT。我现在不明白这两种传球阵型之间的区别。谢谢,安德烈。现在我不理解这两种传递数组之间的区别。