前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言(失效的指针)

C语言(失效的指针)

作者头像
用户2617681
发布2019-08-07 19:04:45
7040
发布2019-08-07 19:04:45
举报
文章被收录于专栏:秘籍酷秘籍酷

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

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

// 失效的指针 int main(void) { void (*p)(); // 定义了一个指针 int a = 100; p = &a; // 让指针p指向了a printf("a: %d\n", *p); // 将p的目标(即a)的值输出 }

下面是输出结果:

a: -3495729482452(乱码)

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

// 失效的指针 int main(void) { void (*p)(); // 定义了一个指针 int a = 100; p = &a; // 让指针p指向了a printf("&a: %#x\n", &a); // 将a的地址以十六进制输出 printf("*p: %#x\n", *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\n", p); // 将指针p存储的地址以十六进制输出 printf("*p: %#x\n", *p); // 将指针p的目标(即a)以十六进制输出 printf("**p: %#x\n", **p); // 将不该输出的东西输出看看! }

下面是输出结果:

p: 0xbfb4788

*p: 0xbfb4788

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

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

点击左下角 阅读原文,没时间慢聊了,快点上车!

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

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

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

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

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