【问题标题】:Errors/warnings passing int/char arrays by reference通过引用传递 int/char 数组的错误/警告
【发布时间】:2011-02-06 19:18:51
【问题描述】:

我正在开发一个程序,我尝试通过引用传递参数。我正在尝试通过引用传递 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 上搜索并尝试了不同的方法来传递参数,但它们似乎都不起作用。 (I took this way of passing parameters from the discussion on StackOverflow here.)

你能告诉我哪里出错了吗?

【问题讨论】:

    标签: c arrays pass-by-reference


    【解决方案1】:

    引用不是 C 语言的一部分,您尝试使用的语法仅适用于 C++。

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

    通常情况下,采用二维数组ints 和一维数组char 的函数将被声明为

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

    等同于:

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

    【讨论】:

    • 所以...我不能在 C 中通过引用传递数组?
    • 不,您可以在 C 中的任何上下文中进行引用。您也不能按值传递数组;当传递给函数时,它们总是衰减到指向它们的第一个元素的指针。
    • 在 C 中,它总是按值传递。阅读更多关于数组衰减到指针的信息。 stackoverflow.com/questions/2448204/…
    • 和@nvl:谢谢。更改函数原型确实使它起作用。我不知道数组在 C 中衰减。
    • @Ankur Banerjee:使用数组指针类型(或/和 C++ 中的数组引用类型)实际上是一种防止数组类型衰减的方法.所以,归根结底,这取决于您的意图,是否希望您的数组类型衰减。
    【解决方案2】:

    首先,正如查尔斯所说,C 没有引用。但通常你可以用指针替换引用,并通过稍微不同的语法得到等效的结果。

    其次,您的描述说您试图传递一个二维 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);
    

    【讨论】:

    • 谢谢,AndreyT。我现在不明白这两种传递数组的区别。
    猜你喜欢
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2012-04-14
    • 1970-01-01
    • 2016-02-02
    相关资源
    最近更新 更多