zoukankan      html  css  js  c++  java
  • C语言(失效的指针)!本以为掌握了C,没想到在第一层!

    曾经以为,C语言对我来说已经深入骨髓,所有语法细节早已烂熟于胸,直到我遇到了一道笔试题,一道丧心病狂的笔试题,才渐渐明白。

    图样,图森破!哎我还是太年轻。


     

    原题代码复杂,记不住,但考核的关键语法点嘴脸如下:

    // 失效的指针

    int main(void)

    {

       void (*p)(); // 定义了一个指针

       int a = 100;

       p = &a;      // 让指针p指向了a

    printf("a: %d ", *p); // 将p的目标(即a)的值输出

    }

    下面是输出结果:

    a: -3495729482452(乱码)


     

    输出结果明显是一个乱码,但这个乱码究竟是啥玩意儿咧?我们将源代码稍作修改:

    // 失效的指针

    int main(void)

    {

       void (*p)(); // 定义了一个指针

       int a = 100;

       p = &a;      // 让指针p指向了a

    printf("&a: %#x ", &a); // 将a的地址以十六进制输出

    printf("*p: %#x ", *p);  // 将p的目标(即a)的值以十六进制输出

    }

    下面是输出结果:

    &a:0xbfb4788

    *p: 0xbfb4788

    两个输出居然完全一样!要知道,p里面就存放了a的地址,也就是说p本来就等于0xbfb4788,但是*p应该是p的目标,也就是100,但为什么还是一个地址呢?


     

    将代码再改一下:

    // 失效的指针

    int main(void)

    {

       void (*p)(); // 定义了一个指针

       int a = 100;

       p = &a;      // 让指针p指向了a

    printf("p: %#x ", p);    // 将指针p存储的地址以十六进制输出

    printf("*p: %#x ", *p);  // 将指针p的目标(即a)以十六进制输出

    printf("**p: %#x ", **p);  // 将不该输出的东西输出看看!

    }

    下面是输出结果:

    p: 0xbfb4788

    *p: 0xbfb4788

    **p:0xbfb4788


     

    简直不敢相信自己的眼睛,在这段代码中,指针p仿佛中邪了,解引用符 * 对它不起作用了,不管p的前面加了多少个 *,始终无法得到p的目标,即a的值!

    这是怎么回事咧?小伙伴,机智如你,将你的见解写入留言,给大家参考参考吧!


     

    如果你想深度学习C语言以及高级编程——编程俱乐部【下图进入】!

    涉及到:C语言、C++、windows编程、网络编程、QT界面开发、Linux编程、游戏编程、黑客等等......


     

    程序员编程入门资料:


     

    程序员​推荐学习书籍:


     

    一个活跃、高逼格、高层次的程序员编程学习殿堂;编程入门只是顺带,思维的提高才有价值!

  • 相关阅读:
    二分图的匹配(未完) yongmou
    树型动态规划 yongmou
    最大堆 yongmou
    C/C++ 编程环境搭建与配置 eclipse + cdt + MinGW yongmou
    ACM必备(学完一个就加亮一个)不多,就这些! yongmou
    joj 2558 Ocean Currents 特别的广搜 yongmou
    Android:自定义对话框
    ubuntu升级11.10后ADT无法安装解决办法
    处理GridView数据源(DataTable)为空行(转)
    ASP.NET无法连接到SQL Server的问题
  • 原文地址:https://www.cnblogs.com/huya-edu/p/13892674.html
Copyright © 2011-2022 走看看