什么是空指针:
《c++的设计和演化》中有这么一段描述空指针:
一个能求出0值的常量表达式被转换为一个指针,通常称为空指针。这个值产生的指针保证能与任何对象或函数指针相区分。
但AMR进一步警告说:空指针不一定用与整数0同样的二进制模式表示。
我的理解是这意味0能表示空指针,但反过来则不成立,即空指针不一定要是0,比如用 (2-2), ~-1。
(演化中进一步又说实际上用它们给指针赋值却是个类型错误,但我用codelite编译是通过的。可能现在的编译器已经按照标准实现了)
空指针怎么定义:
又在c中可以这样定义空指针
#define NULL (void*)0
但这样在c++中却不行,因为c++不允许把void*赋值给其他类型指针。
Bjarne进一步写到他自己的做法就是简单的用0来表示空指针。但无论如何,这样都会遇到下面的问题:
考虑
void f(char*)
void g() {f(0);} //calls f(char*)
现在加上另一个
f(int)就会改变g()的行为。
void g() { f(0);} //calls f(int)
这个又能怎么办呢?Bjarne是这样说的:“我的一个朋友认识到:‘如果0就是他们最糟糕的问题,那么他们太幸运了’”
呵呵。。。