我一直在阅读 C++ Primer 第 5 版。它提到
将 int 变量分配给指针是非法的,即使该变量的值恰好为 0。
我试了一下,结果如下:
int *u = 0; // success
int *w = 123; // fail
/* compile error:
ptr_test.cc:9:12: error: invalid conversion from 'int' to 'int*' [-fpermissive]
int *w = 123;
*/
int zero = 0;
int *v = zero; // fail
/* compile error
ptr_test.cc:9:12: error: invalid conversion from 'int' to 'int*' [-fpermissive]
int *w = zero;
*/
Run Code Online (Sandbox Code Playgroud)
有人可以帮我解释一下指针初始化的确切规则吗?为什么将 int 指针分配给 0 可以,但 123 不行,尽管它们都是整数?为什么 123 会导致转换为“*int”,而 0 不会?
顺便说一句,我使用的是 g++ (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0。
eer*_*ika 20
为什么分配给一个指向 0 的 int 指针是好的
因为 0 除了是整数文字之外,还是空指针常量。空指针常量可以转换为任何指针类型。
但 123 不行
因为 123 或除值为 0 的整数文字之外的任何其他整数文字,都不是空指针常量。并且整数表达式(空指针常量除外)不会隐式转换为指针类型。
为什么 123 会导致转换为“*int”,而 0 不会?
两者都不是“导致演员表”。Cast 是显式转换,在这些示例中,所有转换都是隐式的。从整数到指针的隐式转换格式不正确,这就是您收到错误的原因。空指针转换是隐式且格式良好的,这就是您不会收到错误的原因。
有人可以帮我解释一下确切的规则吗
这是确切的规则(引自最新的 C++ 标准草案):
[转化率]
空指针常量是一个值为 0 的整数文字 ([lex.icon]) 或类型为 的纯右值
std?::?nullptr_t
。空指针常量可以转换为指针类型;结果是该类型([basic.compound])的空指针值,并且与对象指针或函数指针类型的所有其他值区分开来。这种转换称为空指针转换。...
PS 关键字nullptr
是类型的纯右值std?::?nullptr_t
。除非您打算支持 C++11 之前的编译器,否则它应该始终优于使用文字 0。