如何将使用C ++ pass-by-reference的函数转换为C?

时间:2011-09-22 15:46:08

标签: c++ c

我有一段用C ++编写的代码,需要用C语言编写。我转换了大部分代码,但我无法弄清楚如何将函数中的C ++ pass-by-reference转换为C代码,即

示例:

int& a;

它在某些函数中用作输入变量:

void do_something(float f, char ch, int& a)

当我用C编译它时,我得到编译器错误。什么是用C?中的引用替换传递的正确方法?

5 个答案:

答案 0 :(得分:9)

在C中执行此操作的方法是通过指针传递:

void do_something(float f, char ch, int* a)

同时使用in do_something代替

void do_something(float f, char ch, int& a)
{
   a = 5;
   printf("%d", a);
}

您现在需要取消引用a

void do_something(float f, char ch, int* a)
{
   *a = 5;
   printf("%d", *a);
}

在致电do_something时,您需要获取传递的内容的地址,而不是

int foo = 0;
d_something(0.0, 'z', foo);

你需要这样做:

int foo = 0;
d_something(0.0, 'z', &foo);

获取foo的地址(即指针)。

答案 1 :(得分:1)

因为C中没有引用,所以你必须改为使用指针:

void do_something(float f, char ch, int *a)

然后在函数体中你必须取消引用它以获取或修改指向的值:

*a = 5;

假设x中有int,并且您想调用该函数,则使用&运算符获取其地址(将其转换为int *指针):

do_something(f, ch, &x)

答案 2 :(得分:1)

最接近的等价物是指针:

do_something(float f, char ch, int* a)

完成此操作后,您需要更改a - >函数内的任何地方*a,并更改对函数的调用以传递&a而不是a

答案 3 :(得分:1)

“简单”,但不可取的,方法是从帮助器指针变量获取帮助,#define> 随时为此答案提供帮助!如果可以的话,我愿意:)

转过来

int foo(int &a) {
    a = 42;
    /* ... */
    return 0;
}

int foo(int *tmpa) {       /* & to *; rename argument */
    #define a (*tmpa)      /* define argument to old variable */
    a = 42;                /* no change */
    /* ... */              /* no change */
    return 0;              /* no change */
    #undef a               /* "undo" macro */
}

注意:#define的引入必须小心

答案 4 :(得分:1)

在C语言中没有与C ++引用等效的内容。 但是,您可以使用指针。然而,它们是具有自己地址的变量,而C ++引用只是别名。

function do_something(float f, char ch, int* a)