c++中的空指针

Null pointer in C++

本文关键字:空指针 c++      更新时间:2023-10-16

当我在c++中声明一个空指针为int* p=0时,这是否意味着零是整数指针类型的一些特殊常数,或者这是否意味着p指向地址0x0 ?当然,0x0必须是一个特殊的地址,c++在分配变量/数组期间永远不会接触到它。

c++标准定义整型常量0转换为空指针。这并不意味着空指针指向地址0x0。它只是意味着文本'0'在转换为指针时变成空指针。

当然,使空指针具有0x0以外的表示形式是相当复杂的,因此大多数编译器只是让0x0作为空指针地址,并确保没有在零处分配任何内容。

注意,使用这种零转换被认为是糟糕的风格。使用NULL(这是一个预处理器宏,定义为0, 0L或其他零积分常量),或者,如果您的编译器足够新,可以使用nullptr

表示值为0的整型常量表达式在c++中具有特殊含义;它称为空指针常量。当使用这样的表达式初始化指针或对指针赋值时,实现确保该指针包含适当类型的空指针值。这保证是一个不同于任何指向真正对象的指针的值。它可以有也可以没有" 0 "的表示。

ISO/IEC 14882:2011 4.10 [conf .ptr]/1:

空指针常量是一个整型常量表达式(5.19),值为0的整型右值或std::nullptr_t类型的右值。空指针常量可以转换为指针类型;结果是该类型的空指针值,该值与其他所有对象指针或函数指针类型的值不同。

这是一个特殊值,根据标准保证它永远不会等于指向对象或函数的指针。操作符&的地址永远不会产生空指针,也不会产生任何成功的动态内存分配。您不应该将其视为地址0,而应该将其视为指示指针不指向任何地方的特殊值。有一个宏NULL用于此目的,新的习语是nullptr

这意味着它没有指向任何东西

指针的值仅为0。这并不一定意味着它指向地址0x0。NULL宏,只是一个0常量。

指针指向地址0。在大多数平台上,这是非常特殊的,但您应该使用NULL,因为它并不总是0(但经常)。

是。0是一个特殊的常数。事实上,它是唯一可以在不使用显式强制转换的情况下在以下语句中使用的整型常量:

int *pi = 0;  //ok
char *pc = 0; //ok
void *pv = 0; //ok
A *pa = 0;    //ok

一切都可以正常编译。

但是,如果你用这个代替:

int *pi = 1;  //error
char *pc = 2; //error
void *pv = 3; //error
A *pa = 4;    //error

都将给出编译错误。

在c++ 11中,当你表示空指针时,你应该使用nullptr,而不是0

在你的例子中'p'是int型的地址。通过设置p为0,你说有一个地址为0的整数。约定是0是"非有效地址地址",但这只是一个约定。

实际上地址0通常是"未映射的"(即没有内存支持该地址),因此您将在该地址处得到错误。但在某些嵌入式系统中却不是这样。

您也可以选择任何随机地址(例如0xffff7777或任何其他值)作为"空"地址,但您将违反惯例并使许多阅读您的代码的人感到困惑。通常使用0,因为大多数语言都支持有效地测试is- 0和not- 0。

参见这个相关问题:为什么地址0用于空指针?