为什么指针可以为NULL
Why can pointers be NULL
在C或C++中,NULL不就是常量整数0吗?如果值NULL是一个常量整数,为什么我们可以给它分配一些指针?难道编译器不会说这两种类型不匹配吗?
0
的解释取决于上下文。如果它是在一个需要数字的上下文中使用的,那么它就是数字零。如果在需要指针的上下文中使用它,它将被视为空指针。所以,如果你有代码:
int n = 0; // assigns zero
int *p = 0; // assigns null pointer
somefunc((char *)0); // passes null pointer to the function
在C中,允许宏NULL
扩展为整数常数0
或这样的转换为void *
的常数。在C++pre-11中,它可以扩展为一个整数常数,其求值结果为0
。在C++11中,它可以扩展为值为0
的整数文字或类型为std::nullptr_t
的prvalue(例如nullptr
)。
请参阅http://en.cppreference.com/w/cpp/types/NULL对于C++描述,http://en.cppreference.com/w/c/types/NULL用于C描述。
有两个问题:
类型可以具有"特殊"、带外、特殊值。例如,浮点数的值为
NaN
。指针有一个特殊的无效指针值,即空指针。空指针的名称是什么?在C中,无论好坏,它的名称都是
0
。(如果它的名称是像null
或nil
这样的单独关键字,它可以避免各种混淆,但语言定义不是这样产生的。)
但是,是的,您是对的,将常量0
分配给指针变量的能力是一种特殊情况,体现在语言定义中。
6.3.2.3指针
3 nbsp nbsp;值为0的整数常量表达式或转换为类型void *
的表达式称为空指针常量66)如果将空指针常量转换为指针类型,则得到的指针,称为空指针,保证与指向任何对象或函数的指针相比不相等。
66)宏NULL在<stddef.h>(和其他标头)作为空指针常量;参见7.19。
C 2011在线草案
指针上下文中的文字0
由编译器特殊处理,并被理解为空指针常量。在源代码的上下文中,它的行为与任何其他零值表达式类似。
然而,一旦您的代码被转换为机器代码,所有出现的空指针常量都将被替换为底层平台用来表示定义良好的无效指针值的任何值,无论是0
、0xFFFFFFFF
还是0xDEADBEEF
。
相关文章:
- 当使用通配符和null指针调用函数时,对输出的说明
- 当目标指针不是基类的类型时,为什么允许dynamic_cast为多态类生成 null 指针?
- 将位数组转换为 HBITMAP 后 bmBits 的 NULL 指针
- 在访问类的树层次结构中的对象时避免使用 null 指针
- 排序时引用绑定到 'value_type' 类型的 null 指针
- NULL指针解决方案中的C 分割故障
- 取消引用会导致崩溃,即使对于非 NULL 指针也是如此,原因也是如此
- 跟进哈希表 C++,this->next = NULL 指针
- C++中的NULL指针
- 当删除NULL指针(C/C )时,可以保证SegFault
- 引用绑定到类型 'struct value_type' 的 null 指针
- 尝试在C++中使用 NULL 指针时不会发生分段错误
- if(NULL==指针)和if(指针==NULL)之间有什么区别
- 在Linux/GCC下,将NULL指针访问转换为C++异常
- NULL指针检查线程安全
- cppcheck null指针取消引用:m_buffer-否则,针对null进行检查是多余的
- strtok() - 为什么必须传递 NULL 指针才能获取字符串中的下一个标记
- Null指针异常(int Vs char)
- 用户定义类中的Null指针无效
- 不是NULL指针,而是错误的访问错误消息