int f(int x, int y)
{
int u;
u = x*y;
printf("in f\n");
return( x+u+y );
}
int g(int* p, int* q)
{
int v;
v = *p + *q;
printf("in g, before f\n");
*q = f(v, *p);
printf("in g, after f\n");
return( v-*q );
}
int main(void)
{
int a = 1, b = 2, c = 3;
printf("in main, before f and g\n");
a = f(a, b);
b = g(&b, &c);
printf("in main, after f and g\n");
printf("a = %d, b = %d, c = %d\n", a, b, c);
return(EXIT_SUCCESS);
}
我正在努力追踪这个文件,因为我在获取b和c的地址时迷路了。以及指针.-。任何人都可以通过跟踪此代码来解释,因为我完全迷失了。
答案 0 :(得分:1)
如果您要通过调试器运行代码,您会看到每个变量和每个地址会发生什么。输出每个变量的地址将为您提供非常少的信息,因为每次执行时地址很可能会发生变化。
相反,请使用笔和纸,弄清楚自己会发生什么。我将根据您的代码给您一个示例。
这些是main()
中变量的起始值:
a b c
1 2 3
现在调用函数f()
,它不使用指针,因此每个变量的值都复制在函数的参数中。 f(a,b)
的返回值已分配给a
中的main()
,因此现在变量的值变为:
a b c
5 2 3
现在b
和c
的地址已传递给g(p,q)
。在g()
中,局部变量v
成为指针p
和q
内容的总和,它们是b
和c
的值。
*p *q v
2 3 5
现在q
的内容被f()
的调用更改了,v
没有使用指针,只有p
的值和f()
的内容作为参数传递。 q
返回17.所以现在b
的内容(*p *q v
2 17 5
的值)变为17。
g()
现在,函数v
返回q
的值与c
的内容(main()
的值)之间差异的值。
在g()
中,a b c
5 -12 17
返回的值为-12,并将其分配给b。所以现在我们的变量有值:
c
请注意,g()
保留了函数{{1}}的值17,因为它是通过指针修改的。
答案 1 :(得分:0)
在函数调用中看到值将被传递,而在第二个函数中
地址将被传递,这意味着第一个是按值调用而另一个是按
参考,在a=f(a,b);
因此,在返回后存储的值为1+2+2 = 5
。现在a
和b
是局部变量a=5
,b=2
。
现在正在函数调用b=g(&a,&b);
传递地址,指针用于提取存储在该地址的值。根据计算,简单地调用并且值将在传递的参数的地址处被修改,地址没有变化,您仍然可以使用&
运算符来检查自己。