跟踪此文件

时间:2014-07-31 06:46:37

标签: c

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的地址时迷路了。以及指针.-。任何人都可以通过跟踪此代码来解释,因为我完全迷失了。

2 个答案:

答案 0 :(得分:1)

如果您要通过调试器运行代码,您会看到每个变量和每个地址会发生什么。输出每个变量的地址将为您提供非常少的信息,因为每次执行时地址很可能会发生变化。

相反,请使用笔和纸,弄清楚自己会发生什么。我将根据您的代码给您一个示例。

这些是main()中变量的起始值:

a   b   c
1   2   3

现在调用函数f(),它不使用指针,因此每个变量的值都复制在函数的参数中。 f(a,b)的返回值已分配给a中的main(),因此现在变量的值变为:

a   b   c
5   2   3

现在bc的地址已传递给g(p,q)。在g()中,局部变量v成为指针pq内容的总和,它们是bc的值。

*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)

  1. 在函数调用中看到值将被传递,而在第二个函数中 地址将被传递,这意味着第一个是按值调用而另一个是按 参考,在a=f(a,b);

  2. 因此,在返回后存储的值为1+2+2 = 5。现在ab是局部变量a=5b=2

  3. 现在正在函数调用b=g(&a,&b);

  4. 传递地址,指针用于提取存储在该地址的值。根据计算,简单地调用并且值将在传递的参数的地址处被修改,地址没有变化,您仍然可以使用&运算符来检查自己。