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;
    }
    执行结果:
     
  • 相关阅读:
    LeetCode 88. Merge Sorted Array
    LeetCode 75. Sort Colors
    LeetCode 581. Shortest Unsorted Continuous Subarray
    LeetCode 20. Valid Parentheses
    LeetCode 53. Maximum Subarray
    LeetCode 461. Hamming Distance
    LeetCode 448. Find All Numbers Disappeared in an Array
    LeetCode 976. Largest Perimeter Triangle
    LeetCode 1295. Find Numbers with Even Number of Digits
    如何自学并且系统学习计算机网络?(知乎问答)
  • 原文地址:https://www.cnblogs.com/kxzh/p/8598004.html
Copyright © 2011-2022 走看看