20180318 代码错题(3)

在C语言中,以下代码执行之后,*p的值为()
void func(int *p)
{
    static int num = 4;
    p = #
    (*p)--;
}
int main()
{
    int i = 5;
    int *p = &i;
    func(p);
    printf("%d", *p);
    return 0;
}
 
3
4
5
以上都不是

答案 C  错选 B

在函数里,指针p又重新定位成num的地址空间,所以在函数中的自减是修改num的值;而当在main函数中的p指针依然指向 i 的地址空间,在func中没有被修改,那么值不变;
如果函数去掉num,如下:
void func(int *p)
{
(*p)--;
}
此时,就是修改 main函数中 i 的值了。
 
详细分析:
 
如上图,当调用函数的时候,形参指针p会指向实参指针p 所指向的地址空间;
在题目的 func 函数中,形参指针p 指向了新的地址空间num,如下图:
 
那么此时修改形参p 所指向地址空间的值,是不会影响 实参指针p和i 的值。



尽管函数的形参是指针,但是注意,它仍然是“值传递”。
一方面,函数本身没有任何返回;另一方面,函数只是对p的值的处理,并非p的地址。
函数调用时,p作实参,函数中也给p重新赋值,函数确实使静态局部变量num的值减1,但是函数执行完,返回到主函数中,p中的仍然是i的地址。
若要使得p指向num,需要对p的地址进行传递,此时:
void func(int **p)
{
    static int num = 4;
    *p = #
    (**p)--;
}
int main()
{
    int i = 5;
    int *p = &i;
    func(&p);
    printf("%d",*p);
    return 0;
}
执行结果:
 
原文地址:https://www.cnblogs.com/kxzh/p/8598004.html