这是代码段
void F (int a, int *b)
{
a = 7 ;
*b = a ;
b = &a ;
*b = 4 ;
printf("%d, %d\n", a, *b) ;
}
int main()
{
int m = 3, n = 5;
F(m, &n) ;
printf("%d, %d\n", m, n) ;
return 0;
}
回答
4 4
3 7
我看到4 4
是如何计算的,我不知道他们是如何得到的3 7
(我明白如何计算3,它没有改变,因为它没有通过引用传递)
谢谢!
答案 0 :(得分:7)
我已使用注释注释了F
函数来解释发生了什么:
a = 7 ; // a is now 7
*b = a ; // b points to n, so n is now 7
b = &a ; // b now points to a and no longer to n
*b = 4 ; // a is now 4. n is unaffected
答案 1 :(得分:4)
在main
开头,我们有
m=3 n=5 // int m = 3, n = 5;
然后我们调用F(m, &n)
,按值传递m
,用指针传递n
这样
m = 3 n = 5
a = 3 b->n // F(m, &n);
现在,在F()
内,我们将7
分配给a
:
m = 3 n = 5
a = 7 b->n // a = 7
然后我们将a
(= 7)分配给b
指定的内存地址( - > n)
m = 3 n = 7
a = 7 b->n // *b = a;
接下来我们更改b
,现在b
指向a
:
m = 3 n = 7
a = 7 b->a // b = &a;
然后我们将4分配给b
指定的内存地址( - > a)
m = 3 n = 7
a = 4 b->a // *b = 4;
打印a
(= 4)和*b
( - > a = 4)
并在函数外打印m
(= 3)和n
(= 7)
答案 2 :(得分:1)
仔细看看这一行
b = &a ;
*b = 4 ;
b获取(它的内存地址)的引用。当你现在访问* b时,它指向变量a的内存,而不再是n
答案 3 :(得分:1)
确实非常微妙。 :)
在F
中发生了很多废话:无论通过a
传递哪个值,它都会被丢弃,而是分配给它。然后,将a
(即7)的值分配给b
指向的变量(n
,因此n
变为7)。
在下一行,b
指向的对象发生了变化,因此b
现在指向本地参数a
,并在下一行指向b
{1}}(=> a
)设置为4。
因此,现在我们a
为b
,a
指向*b==4
(=>所以*b==a
,因为m
),{ {1}}仍然是3(它是按值传递的,因此F
无法更改),而n
设置为7。
顺便说一句,完全你应该在应用程序中所有的混乱,以避免让任何有耻辱的人混淆他们。 :)