我有以下代码 -
#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
作为输出。为什么会这样?
答案 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
x
和y
传递给ChangeDaata
。
现在,在ChangeData()
中,ax
的地址为x
,而ay
的地址必须为y
。
执行ax = ay;
后,ax
将等于ay
。因此,从那时起,ax
将具有y
的地址。现在,无论你对*ax
做什么都会改变y
和 NOT x
的价值 - 正如你错误的期待的那样。即当您执行*ax=*ax+*ay;
时,它会更改y
的值 - 而不是x
的值。
因此,您发现x
的值从未改变过:如您printf
声明的输出中所示。打印y
的值,您可以看到它的值将被挂起。