C ++中的空指针

时间:2011-09-25 17:15:52

标签: c++ pointers

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

8 个答案:

答案 0 :(得分:9)

C ++标准定义整数常量0转换为空指针。 这并不意味着空指针指向地址0x0 。它只是意味着当转换为指针时,文本“0”变为空指针。

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

请注意,使用此零转换被视为不良风格。使用NULL(预处理器宏定义为00L或其他零积分常量),或者,如果您的编译器足够新以支持它,{{3} }。

答案 1 :(得分:3)

这意味着值为零的整数常量表达式在C ++中具有特殊含义;它被称为空指针常量。当您使用这样的表达式初始化指针或指定指针时,实现确保指针包含适当类型的空指针值。这保证与指向真实对象的任何指针的值不同。它可能有也可能没有“零”的表示。

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

  

空指针常量是整数类型的整数常量表达式(5.19)prvalue,其求值为零或类型为std::nullptr_t的prvalue。空指针常量可以转换为指针类型;结果是该类型的空指针值,并且可以与对象指针或函数指针类型的每个其他值区分开来。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

答案 6 :(得分: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

答案 7 :(得分:0)

在您的示例中,'p'是int的地址。通过将p设置为0,你说地址为0的是一个int。约定是0是“不是有效的地址”,但它只是一个约定。

在pratice中,地址0通常是“未映射”的(即没有内存支持该地址),因此您将在该地址出错。但是,在某些嵌入式系统中并非如此。

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

请参阅此相关问题:Why is address zero used for the null pointer?