- 论坛徽章:
- 0
|
空指针究竟指向了内存的哪个地方?
请后继发贴者看清前面的贴子再接, 我把一些我认为正确的观点再写一下:
1、0 和 (viod *)0 是零指针常数
2、0 或 (void *)0 转换为 (type *)0 后,称为零指针
3、零指针与任何指向有效地址的指针比较一定不等
4、stddef.h 中有一个标准的宏 NULL,该宏被规定为 实现定义的零指针常数.
以上 4 条均是 ANSI C 标准的规定,一个符合 ANSI 标准的编译器必须支持它们。根据以上4条,if (p) 与 if (p != NULL) 等价。
感谢 我不懂C++ 兄, 他指出,标准并未规定:你不可以用自己定义的 NULL 去覆盖 stddef.h 中的 NULL, 所以用 if (P == NULL) 不好。
我同意此观点的根据,但不同意其结论。NULL 的作用在于 ``提示此为一指针'',是否用 NULL,是一个风格的问题。而且 NULL 的用法在 c 里已经是事实标准。
重定义 NULL 是很稀奇的事。如果你认为重定义一个宏没什么大不了,请注意 NULL 是一个 ANSI C 规定实现的标准宏。
重定义 NULL 与重定义标准库函数可以相提并论。与宏一样,函数库也并非语言的一部份,但 ANSI C 还是规定了一些标准库。没人可以禁止你实现自己的 printf,并覆盖 stdio 中的 printf,而你自己实现的 printf 可以调用一个 abort 使程序崩溃 。 |
|