zoukankan      html  css  js  c++  java
  • 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;
    }
    执行结果:
     
  • 相关阅读:
    安装、升级pip,但是python -m pip install --upgrade pip报错
    架构即未来阅读笔记3
    第十二周学习总结
    《大型网站技术架构:核心原理与案分析》阅读笔记02
    2021寒假(12)
    2021寒假(10)
    Spark简介
    《大型网站技术架构:核心原理与案分析》阅读笔记01
    2021寒假(9)
    2021寒假(8)
  • 原文地址:https://www.cnblogs.com/kxzh/p/8598004.html
Copyright © 2011-2022 走看看