如何通过引用传递在C中

时间:2014-03-04 12:35:36

标签: c

我有两个不同输出的代码。需要一个很好的解释,它是如何在内存中工作的。

#include "stdafx.h"

int *fun(int *j)
{
    *j++;
    return j;
}

int _tmain(int argc, _TCHAR* argv[])
{
    int i = 10;
    int *j,*k;
    j = &i;
    k = fun(j);
    printf("Now the value = %d",i);
    printf("Now the value = %d",*j);
    printf("Now the value = %d",*k);
    return 0;
}

这里的输出是:10,10和 - (某些值)。

如果我按照以下方式更改括号:

#include "stdafx.h"

int *fun(int *j)
{
    (*j)++;
    return j;
}

int _tmain(int argc, _TCHAR* argv[])
{
    int i = 10;
    int *j,*k;
    j = &i;
    k = fun(j);
    printf("Now the value = %d",i);
    printf("Now the value = %d",*j);
    printf("Now the value = %d",*k);
    return 0;
}

这里的输出是:11,11,11

这是我在Visual studio中做的。请给出一个很好的解释。谢谢。

2 个答案:

答案 0 :(得分:1)

这里的问题是operator precedence。因为后缀++运算符的优先级高于解除引用运算符*,所以对指针进行增量而不是取消引用的值。

因此该函数返回增加的指针,该指针现在指向其他位置,因此kmain的取消引用将是未定义的行为。

答案 1 :(得分:0)

*j++;
return j;

这会增加指针j,然后返回递增的指针。有两种方法可以解释*j++:增加j或增加*j。但是因为后增量++具有higher precedence而不是指针去引用,所以解释是增加j

请注意,此版本程序的行为未定义,因为无法保证您返回的指针有效。当你运行这个版本的程序时,任何事情都可能发生。

(*j)++;
return j;

这里括号指定要使用的解释,并覆盖优先规则。此代码会增加j指向的值,而不会修改j。因此return语句返回原始指针。此版本的代码至少表现出明确定义的行为。