以下代码(拍摄from here):
int* ptr = int();
在Visual C ++中编译并对指针进行值初始化。
怎么可能?我的意思是int()
会产生int
类型的对象,而我无法为指针分配int
。
上面的代码怎么不违法?
答案 0 :(得分:110)
int()
是一个值为0的常量表达式,因此它是产生空指针常量的有效方法。最终,这只是一种略微不同的说法int *ptr = NULL;
答案 1 :(得分:35)
因为int()
会产生0
,NULL
可与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