我们能初始化一个指针,它的变量是否为常数,在C++中有0个值? 根据C++ C++入门书,我们可以为指针赋值为const,并赋值为0。这是这本书的相关内容

我们能初始化一个指针,它的变量是否为常数,在C++中有0个值? 根据C++ C++入门书,我们可以为指针赋值为const,并赋值为0。这是这本书的相关内容,c++,pointers,nullptr,null-pointer,C++,Pointers,Nullptr,Null Pointer,可以指定文字0或常量,其值在编译时已知为0: 然后提供以下代码片段 int ival; int zero = 0; const int c_ival = 0; int *pi = ival; // error pi = zero; // error pi = c_ival // ok: c_ival is a const with compile-time value of 0 但是,当我运行类似的代码时,会抛出一个错误 int ma

可以指定文字0或常量,其值在编译时已知为0:

然后提供以下代码片段

int ival;
int zero = 0;
const int c_ival = 0;
int *pi = ival;        // error
pi = zero;             // error
pi = c_ival            // ok: c_ival is a const with compile-time value of 0
但是,当我运行类似的代码时,会抛出一个错误

int main()
{
    const int c_ival = 0;
    int *pi = c_ival;            
}
错误:从“int”到“int*”的转换无效[-fpermissive]

我做错了什么?

c\ival的类型是int。pi的类型是int*。无法将int隐式转换为int*,因此必须使用类型转换:

int*pi=int*c_ival;//C型铸件 //-或- int*pi=reinterpret\u castc\u ival;//C++风格的演员表
这两种方法都有效,但都相当糟糕。只需将NulLPTR分配给指针,这些指针不指向任何东西,远离零。

< P>取决于您的C++底漆版本,并间接地指向它的标准修订版,这可能只是过时的信息。 你看,C++03和C++11之间的定义发生了变化。过去,它说:

[conv.ptr]

1空指针常量是整数常量表达式5.19 计算结果为零的整数类型的右值

但是一个未解决的缺陷报告被追溯到C++11并将措辞更改为

[conv.ptr]

1空指针常量是整数文本5.13.2[lex.icon] 值为零或类型为std::nullptr\t的prvalue

因此,由于C++11C_-ival不再具备资格。它不是一个文本0,尽管它仍然是一个值为0的常量表达式

可以初始化一个变量为常数的指针,在C++中有值0?< /P> 我们过去是。自从C++11以来,我们再也不能这样做了

我做错了什么


您正在阅读本书的过时版本。

您使用的编译器和编译器标志是什么?这将在C++98中编译,但不会在C++11+中编译。在现代C++中,更倾向于使用。甚至值得一提的是,这会使表达式如1-1。@ CIGIEN或类似定义假“--”的表达式无效。