0 引言
本文主要是写给自信知道“指针”是什么玩意儿的读者看的。最好看完再评论。(我大致上能确定 99% 以上的并没有足够重视这里的坑,不够了解现实。)
不知道指针是啥的虽然看了基本是浪费时间,不过至少务必记住:不是所有叫“指针”的东西都是一回事。
引用:
http://tieba.baidu.com/p/3605563618 24L
http://tieba.baidu.com/p/3615289496?pn=2
1 什么是指针
本文所谓的指针(pointer) ,是指C和C++等语言中的内建的语言特性。
在不同范畴中指针这个概念有所不同。在体系结构规范中,指针指称特定的整数字节地址或者两个地址的差(地址偏移量),是整数数值;而在C和C++中,作为核心语言特性支持的指针是一类类型的统称。这两种完全不同的概念经常被混淆,造成一些稀里糊涂的问题(和数组混在一起的时候尤甚)。除非另行说明,本文总是指后者,并不对此进一步展开论述。
C和C++中,指针(右)值是具有指针类型的(右)值。指针值有时也会被和指针混淆,但在健全的理解下通常能消歧义,因此问题不大(数组也有类似的情况,但涉及转换,问题相对严重)。为清晰起见,在这里不会不加区分地使用。
注意,C++的成员指针(pointer-to-member)明确地不是指针。尽管它的数值表示在一些情况下可能被实现为地址的偏移量,但语言中并不存在这种保证,实际也通常不那么简单。重复:成员指针不是这里讨论的指针。
此外,C++中,除了作为语言特性支持的内建(builtin) 指针,也有所谓的智能指针(smart pointer) 。后者在概念上也被 ISO C++11 以来的标准库正式支持。这里讨论的指针不包括这些智能指针,尽管后者和主题相关,并且会在下文重点讨论。
2 什么是设计
这里讨论的设计,是指语言的设计,也就是语言规则的作者决定语言特性中应该存在什么和不存在什么的决策之下的抽象结果。
用户如何使用指针即语用问题是和本文主题相关的问题,会一并讨论,但和这里的设计是两个不同的话题。
3 什么是糟糕
糟糕是一个形容词。
形容设计的糟糕从两个递进的视点得出:对照设计要解决的问题,即需求;对照同类解决方案,即语言中的其它特性或应用领域有交集的其它程序设计语言中的特性。
通俗地,糟糕以“不好用”和“并非不得不好用”来表现。
注意因为语言规则之间的相互作用,是否“好用”或者说要解决的问题,须结合使用场景下的其它问题一并讨论:一项特性即便能很好地解决某些问题,但若几乎总是引起其它难以回避的问题,那么至少是“不够好用”的;而要造成的问题麻烦到一定程度时就显然“不好用”了。
本文主要是写给自信知道“指针”是什么玩意儿的读者看的。最好看完再评论。(我大致上能确定 99% 以上的并没有足够重视这里的坑,不够了解现实。)
不知道指针是啥的虽然看了基本是浪费时间,不过至少务必记住:不是所有叫“指针”的东西都是一回事。
引用:
http://tieba.baidu.com/p/3605563618 24L
http://tieba.baidu.com/p/3615289496?pn=2
1 什么是指针
本文所谓的指针(pointer) ,是指C和C++等语言中的内建的语言特性。
在不同范畴中指针这个概念有所不同。在体系结构规范中,指针指称特定的整数字节地址或者两个地址的差(地址偏移量),是整数数值;而在C和C++中,作为核心语言特性支持的指针是一类类型的统称。这两种完全不同的概念经常被混淆,造成一些稀里糊涂的问题(和数组混在一起的时候尤甚)。除非另行说明,本文总是指后者,并不对此进一步展开论述。
C和C++中,指针(右)值是具有指针类型的(右)值。指针值有时也会被和指针混淆,但在健全的理解下通常能消歧义,因此问题不大(数组也有类似的情况,但涉及转换,问题相对严重)。为清晰起见,在这里不会不加区分地使用。
注意,C++的成员指针(pointer-to-member)明确地不是指针。尽管它的数值表示在一些情况下可能被实现为地址的偏移量,但语言中并不存在这种保证,实际也通常不那么简单。重复:成员指针不是这里讨论的指针。
此外,C++中,除了作为语言特性支持的内建(builtin) 指针,也有所谓的智能指针(smart pointer) 。后者在概念上也被 ISO C++11 以来的标准库正式支持。这里讨论的指针不包括这些智能指针,尽管后者和主题相关,并且会在下文重点讨论。
2 什么是设计
这里讨论的设计,是指语言的设计,也就是语言规则的作者决定语言特性中应该存在什么和不存在什么的决策之下的抽象结果。
用户如何使用指针即语用问题是和本文主题相关的问题,会一并讨论,但和这里的设计是两个不同的话题。
3 什么是糟糕
糟糕是一个形容词。
形容设计的糟糕从两个递进的视点得出:对照设计要解决的问题,即需求;对照同类解决方案,即语言中的其它特性或应用领域有交集的其它程序设计语言中的特性。
通俗地,糟糕以“不好用”和“并非不得不好用”来表现。
注意因为语言规则之间的相互作用,是否“好用”或者说要解决的问题,须结合使用场景下的其它问题一并讨论:一项特性即便能很好地解决某些问题,但若几乎总是引起其它难以回避的问题,那么至少是“不够好用”的;而要造成的问题麻烦到一定程度时就显然“不好用”了。