在C ++中,我声明一个空指针为int* p=0
,这是否意味着零是整数指针类型的一些特殊常量,或者它是否意味着p
指向地址{{1 }}?
当然,0x0
必须是C ++在分配变量/数组时从不接触的特殊地址。
答案 0 :(得分:9)
C ++标准定义整数常量0转换为空指针。 这并不意味着空指针指向地址0x0 。它只是意味着当转换为指针时,文本“0”变为空指针。
当然,使空指针具有除0x0
之外的表示相当复杂,因此大多数编译器只让0x0
为空指针地址,并确保在零处分配任何内容。
请注意,使用此零转换被视为不良风格。使用NULL
(预处理器宏定义为0
,0L
或其他零积分常量),或者,如果您的编译器足够新以支持它,{{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或任何其他值)作为“空”地址,但你会违反惯例并使很多人阅读你的代码感到困惑。通常使用零,因为大多数语言都支持有效测试零 - 非零。