前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >居然还有这种操作?

居然还有这种操作?

作者头像
用户2617681
发布2019-08-08 15:19:32
2510
发布2019-08-08 15:19:32
举报
文章被收录于专栏:秘籍酷
曾经以为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);

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-07-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 秘籍酷 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档