《C++ Primer》关于 reference 和 pointer 部分看的人“生气”

2022-03-15 12:13:14 +08:00
 vcfghtyjc

对 C++一直是一知半解。最近正式的重读《 C++ Primer 》,不知道为什么看到 reference 和 pointer (章节:2.3 )莫名的生气。

不理解当初设计 C++的人多喜欢“&” 和 “*” 这两个符号。为什么不同功能要用同样的符号啊?!"&" 放在定义处代表引用,放到定义过的变量前代表取地址。键盘上那么多符号,就不能换个符号吗?当初大学 C++学的不好这个设计要背一半的锅。😂

7640 次点击
所在节点    C++
64 条回复
dongfang
2022-03-16 17:42:46 +08:00
@FrankHB 涨知识了。
其实,我是对上面一些评论的回复,我想表达的是,引用和指针不一样,是两回事。
具体的编译器实现,我确实不了解。
另外,函数指针难道不也是函数的入口地址吗?也是指向内存空间的某个位置吧。
这里面的细节我确实理解不够深入。
但是,我一直把指针百分百地当做内存地址,目前来说没有遇到反例。
dongfang
2022-03-16 17:51:55 +08:00
@FrankHB
关于指针和内存地址的讨论,能展开说说吗?
比如函数指针,难道不是指向函数的入口地址吗?
比如某个对象的指针,不能理解成存储对象的内存地址吗?
如果这些指针都能当做内存地址,把指针和内存地址等价,是不是也可以呢?
个人理解确实不够深入,真心地请教一下,感谢感谢。
codehz
2022-03-17 11:49:47 +08:00
@dongfang c++指针还真没那么简单(
考虑有指向成员的指针( T C::*),指向函数成员的指针(T (C::*)())(要求在基类取指针后在子类对象上用能正确调用到正确实现,成员指针也是能在继承链中正确取得特定对象的成员)
另外关于语法的问题,会出问题的反而不是取地址运算符,而是类似 a*b 的序列,在不知道符号表的情况下,无法确定是乘法运算还是声明(考虑到 if 可以在条件里写声明,这实际上是可以存在冲突的,虽然对于编译器来说符号表永远存在,但是编辑器和人类来说就困难了)
ColorfulBoar
2022-03-25 14:09:25 +08:00
@dongfang
真把指针当内存地址就等着哪天被 UB 干爆吧……心(抽)理(象)上(机)把指针当成是 provenance 和地址打包在一起的一个东西比较好(如果你喜欢也可以说指针空间是地址空间上的纤维丛,我是没有任何意见),至于具体编译出什么玩意来就不好说了,反正肯定不能保证是你想象中的那个地址。
细节可以参考
https://www.ralfj.de/blog/2018/07/24/pointers-and-bytes.html
https://www.ralfj.de/blog/2020/12/14/provenance.html
这个系列,里面简单解释了一下我就不重复了。另外
https://github.com/rust-lang/unsafe-code-guidelines/blob/master/wip/memory-interface.md
也有点用,虽然是讲 Rust 的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/840451

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX