“int * ptr = int()”值初始化如何不违法?

时间:2011-11-09 16:10:44

标签: c++ visual-c++ pointers initialization built-in-types

以下代码(拍摄from here):

int* ptr = int();

在Visual C ++中编译并对指针进行值初始化。

怎么可能?我的意思是int()会产生int类型的对象,而我无法为指针分配int

上面的代码怎么不违法?

5 个答案:

答案 0 :(得分:110)

int()是一个值为0的常量表达式,因此它是产生空指针常量的有效方法。最终,这只是一种略微不同的说法int *ptr = NULL;

答案 1 :(得分:35)

因为int()会产生0NULL可与NULL互换。 0本身定义为NULL,与C (void *) 0 int* ptr = int(5); 不同。

请注意,这将是一个错误:

int* ptr = int(0);

这仍然有效:

0

0是一个特殊的常量值,因此它可以被视为指针值。产生1 - 1的常量表达式(例如{{1}})也允许作为空指针常量。

答案 2 :(得分:18)

表达式int()求值为一个常量的默认初始化整数,即值0.该值是特殊的:它用于初始化指向NULL状态的指针。

答案 3 :(得分:13)

从n3290(C ++ 03使用类似文本),4.10指针转换[conv.ptr]第1段(重点是我的):

  

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

int()是整数类型的整数常量表达式prvalue,其值为零(这是一个满口!),因此可用于初始化指针类型。如您所见,0不是唯一的特殊表达式。

答案 4 :(得分:4)

Well int不是一个对象。

我相信这里发生的事情是你告诉int *指向一个由int()确定的内存地址

所以如果int()创建0,则int *将指向内存地址0