“int * ptr = int()”的值初始化是不是非法的?

下面的代码(取自这里 ):

int* ptr = int(); 

在Visual C ++中编译并初始化指针。

这怎么可能? 我的意思是int()产生一个inttypes的对象,我不能指定一个int指针。

上面的代码是不是非法的?

int()是一个值为0的常量expression式,所以它是生成空指针常量的有效方法。 最终,这只是一个略有不同的方式说int *ptr = NULL;

因为int()产生0 ,它可以与NULL互换。 NULL本身被定义为0 ,不像C的NULL(void *) 0

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

 int* ptr = int(5); 

这仍然会工作:

 int* ptr = int(0); 

0是一个特殊的常量值,因此它可以被当作一个指针值。 产生0常量expression式,比如1 - 1也可以作为空指针常量。

expression式int()计算结果是一个常量默认初始化的整数,它是值0.该值是特殊的:它用于初始化指向NULL状态的指针。

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

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

int()是一个整数types的整型常量expression式prvalue,其值为0(这真是一口!),因此可以用来初始化一个指针types。 正如你所看到的, 0不是唯一的特殊expression。

那么int不是一个对象。

我相信这里发生了什么是你告诉int *指向由int()确定的一些内存地址

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