通过引用传递参数和c中的指针

时间:2016-08-01 02:51:31

标签: c

我有以下代码 -

#include <stdio.h>

void changeData(int * ax,int * ay)
{
    ax=ay;
    *ay=0;
    *ax=*ax+*ay;
}

int main()
{
    int x=13;
    int y=21;

    changeData(&x,&y);

    printf("x: %d\n",x );

}

由于我正在ax=ay,所以ax=21,然后是*ax=21+0=21 因此,打印的答案应为21。但我得到x=13作为输出。为什么会这样?

2 个答案:

答案 0 :(得分:3)

严格来说,

C不支持通过引用传递。您可以传递变量地址的值并取消引用该值。

您的函数将局部变量[support@solace ~]$ cat /proc/sys/dev/raid/speed_limit_max [support@solace ~]$ cat /proc/sys/dev/raid/speed_limit_min 更改为与ax保持相同的值,即main中ay的地址。此时,此函数中的任何变量都不包含main中y的地址,因此无法修改。

x中的下一行解除引用changeData并将该地址的值(即main中的ay)设置为0.第三行然后取消引用y包含ax的地址,而不是y,并将其设置为值x指向main中的ax(包含0)加上值y指向(再次,main中的ay为0)。

当函数返回时,y未更改,因此x输出13.如果您同时打印printf,则会看到它为0.

答案 1 :(得分:2)

如果您使用21代替*ax = *ay;,则打印的答案为ax = ay

为什么结果会显示13

当您致电ChangeData(&x, &y);时,您正在做的是将addresses xy传递给ChangeDaata

现在,在ChangeData()中,ax的地址为x,而ay的地址必须为y

执行ax = ay;后,ax将等于ay。因此,从那时起,ax将具有y的地址。现在,无论你对*ax做什么都会改变y NOT x的价值 - 正如你错误的期待的那样。即当您执行*ax=*ax+*ay;时,它会更改y的值 - 而不是x的值。

因此,您发现x的值从未改变过:如您printf声明的输出中所示。打印y的值,您可以看到它的值将被挂起。

相关问题