C中的指针,不明白他们是如何得到这个结果的

时间:2010-10-10 21:27:56

标签: c

这是代码段

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,它没有改变,因为它没有通过引用传递)

谢谢!

4 个答案:

答案 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。

因此,现在我们aba指向*b==4(=>所以*b==a,因为m),{ {1}}仍然是3(它是按值传递的,因此F无法更改),而n设置为7。

顺便说一句,完全你应该在应用程序中所有的混乱,以避免让任何有耻辱的人混淆他们。 :)