专栏首页秘籍酷居然还有这种操作?

居然还有这种操作?

曾经以为C语言已经深入骨髓,融入血液,直到看到一到这样的面试题,才发现学海无涯:

请问代码中,第10、11和12行,分别会输出什么?

一般而言我们会认为,对于任何指针p,表达式*p的含义就是取p的目标,但上题中,这三行的执行结果是:

a: 0x100 p: 0xbffa12e4 *p: 0xbffa12e4(竟然不是0x100 ?!)

这个结果的分析如下:

1,首先,a的值是0x100,这个没什么毛病。

2,其次,p的值是0xbffa12e4是变量a的地址,直接输出,也没什么毛病。毕竟,第8行的代码就是让变量a的地址,存放到指针p里面。

3,再其次,*p的输出结果就有点不可理解了,按道理,*p值得就是p所指向的目标,也就是变量a,那应该输出 0x100 才对,但结果却依然是a的地址,仿佛目标引用符 * 不起作用了?

这道题目的怪异之处是,p 和 *p 是一!样!的!

造成指针的目标引用符失效的原因,在第5行。p的定义说明了p是一个函数指针,函数指针虽然也是指针,但他跟普通的指针有一个极大的区别,那就是指针的目标引用符*,对他是无效的!

换句话讲,假如一个指针指向了一个函数,例如这样:

void somefunc(int a); void (*p)(int a); p = &somefunc;

那么,当我们要使用指针p来引用这个函数somefunc的时候,既可以用普通的方式写上星号来引用,也可以什么都不写,效果完全一样:

(*p)(100); // 相当于调用了函数 somefunc(100); p(100); // 也相当于调用了函数 somefunc(100);

版权所无,欢迎分享,吐槽,转发,点赞。

本文分享自微信公众号 - 秘籍酷(mijiku040),作者:林世霖

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-07-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Samba服务

    很多时候我们需要同时用到windows和Ubuntu两个平台,这就涉及如何在它们之间传递文件、程序、数据的问题,这可以有很大办法,samba是其中的一个可选项。

    用户2617681
  • C语言(函数指针)

    前几天在佛科大,惊闻某为同学学习指针学了一年,且未的要领!我当时除了深深吃了一斤之外,瞬间觉得自己的工作是如此的重要和迫切!对于指针这类调皮鬼,今天来聊聊函数指...

    用户2617681
  • malloc 背后的系统知识

    面试的时候经常会被问到 malloc 的实现。从操作系统层面来说,malloc 确实是考察面试者对操作系统底层的存储管理理解的一个很好的方式,涉及到虚拟内存、分...

    用户2617681
  • jMeter工具里左边树形结构里一些节点属性的介绍

    thread group:线程属性介绍,在用jMeter模拟大量并发请求时很有用,比如每个Thread模拟一个并发请求。

    Jerry Wang
  • C++栈展开如何防止内存泄露

    在栈展开(stack unwinding)是指,如果在一个函数内部抛出异常,而此异常并未在该函数内部被捕捉,就将导致该函数的运行在抛出异常处结束,所有已经分配在...

    Dabelv
  • 再议Linux的禁ping设置——以CentOS7.4为例

    版权声明:本文为耕耘实录原创文章,各大自媒体平台同步更新。欢迎转载,转载请注明出处,谢谢

    耕耘实录
  • 函数式编程与面向对象编程[2]: 静态类型语言的表达力 静态类型语言与动态类型语言函数式编程与面向对象编程[2]: 静态类型语言的表达力 静态类型语言与动态类型语言

    像Java或者C#这样强类型的准静态语言在实现复杂的业务逻辑、开发大型商业系统、以及那些生命周期很长的应用中也有着非常强的优势

    一个会写诗的程序员
  • 跟着3306π走进腾讯云

    瞧! 现场的小伙伴都是在很认真的听讲呢,虽然外面飘着小雨(同时还出着太阳,四不四有点魔性),但是成都技术圈的学习热情,就好像成都辣椒一样火热的,提问根本停不下来...

    [3306 Pai ] 社区
  • cssjshtml vue.js 父组件向子组件传值

    葫芦
  • 开发 | 提升 1 倍运行效率!有了这些技巧,你的小程序也能快如闪电

    微信小程序的一大优势体现在「小」上面,小而轻的微信小程序,能给用户带来非常良好的体验。

    知晓君

扫码关注云+社区

领取腾讯云代金券