“int * ptr = int()”的值初始化是不是非法的?
下面的代码(取自这里 ):
int* ptr = int();
在Visual C ++中编译并初始化指针。
这怎么可能? 我的意思是int()
产生一个int
types的对象,我不能指定一个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