Tricky C函数测试知识静态,全局,局部变量和指针

时间:2017-03-21 08:53:46

标签: c pointers

免责声明:是的,这是一个家庭作业问题。我很难理解函数f2的作用。

#include <stdio.h>
int i = 10; /* global variable */
int j = 1; /* global variable */
/* Forward function declarations */
void swap(int, int); int f1(int);
void f2(int, int *);

int main()
{
    {
        int i = 1;
        int j = 10;
        swap(i,j); printf("i = %d j = %d\n", i,j);
        j = f1(i++); printf("i = %d j = %d\n", i,j);
        f2(f1(i),&j); printf("i = %d j = %d\n", i,j);
        //which j does this refer to? The static variable, global, or local and why
    }
    j = f1(i/2); printf("i = %d j = %d\n", i,j);
    f2(f1(i),&j); printf("i = %d j = %d\n", i,j);
    return 0;
}
void swap(int a, int b)
{
    int temp;
    temp=b; b=a; a=temp;
}
int f1(int x)
{
    static int j = 5;
    i++;
    j+=x;
    return j;
}
void f2(int x, int *p)
{
    *p+=x;
    *p = (*p>20) ? 20 :*p++;
}

当我将此代码运行到编译器中时,我得到以下答案:

i = 1 j = 10
i = 2 j = 6
i = 14 j = 14
i = 13 j = 14
i = 14 j = 20

我理解第一组i和j,因为变量a和b在堆中被删除,因此swap没有做任何事情。

对于第二组,我们在main中递增i,然后我们将值1用作x,因为i ++是后递增的。我们创建一个静态变量j,全局变量x增加到11,并且它将j返回为6,因为x被添加到j。函数完成后,main中的i变量增加到2.这导致2和6。

对于第三个print语句,我首先调用等于2的f1(i),这将j重置为5并将全局变量i递增为12.然后j设置为7并且我们为f1返回7(i )。那么这就是我遇到困难的部分。然后我们将j的内存位置作为参数传递,但是我们传递哪个j,为什么?从输出看起来好像静态j的内存正在通过,但我不确定。

当我们进入函数f2时,我们得到* p + = x,我认为它给出值14,因为x从之前设置为7而j也是7.我没有得到的是第二行:“ * p =(* p> 20)?20:* p ++;“。这甚至意味着什么?从输出中它似乎已将j的值复制到i。

函数f2中的第二行代码是什么以及哪一个j(在其前面带有&amp;符号的粗体代码)在“f2(f1(i),&amp; ”行中调用j ); printf(“i =%dj =%d \ n”,i,j);“。

1 个答案:

答案 0 :(得分:1)

f2的说明执行以下操作:

*p+=x;

这会将x的值添加到p指向的位置存储的内容中。 *取消引用指针p

*p = (*p>20) ? 20 :*p++;

如果p中存储的值大于20,则将{20}存储在p。否则将p的值存储在p并增加p,这是未定义的行为(Cool Guy指出),因为*p++等同于*p = *p; p++;