我们从 Stephen Prata 的书 - The C++ Programming Language(第 6 版)中得到以下声明。页 330:
你可以把const和非常量数据的地址都赋给一个指向常量的指针,假设数据本身不是指针,但是你只能把非常量数据的地址赋给一个非常量指针。
在我的理解中,有以下几点,与笔者第一部分的观点不谋而合:
const int a = 5;
int b = 6;
const int * ptr = &a; //Допустимая операция, невозможно изменить значение a через указатель и переменную a.
const int * ptr2 = &b; //Допустимая операция, невозможно изменить значение b через указатель, но возможно через переменную b.
但是,“但只允许将非常量数据的地址分配给非常量指针”的部分引起误解,按照作者的逻辑,以下行为是不可接受的:
int a = 5;
int * const ptr = &a; //Недопустимо, так как указатель константный, указывает на не константный тип.
然而,这段代码编译成功,这对我来说似乎很合乎逻辑,因为结果我们得到了一个指针,不可能改变地址,但没有什么能阻止通过指针 (*ptr) 改变变量的值。
其实问题是,作者想表达什么,我从他的陈述中误解了什么?
作者在声明的第二部分中的意思如下。
如果您有以下广告
然后你可以写
但你不能写
关于这句话中指针本身的稳定性,我们没有讨论。不幸的是,指向非常量数据的指针被称为非常量指针。:)
关于你的例子
那么如果你严格接近,那么就没有赋值操作。这是常量对象的初始化发生的地方。如果您使用真正的赋值,编译器将发出一条错误消息。
例如,
这段代码不会编译,因为const指针在声明的时候必须初始化,而且不能给它赋值。
作者的意思是这样说的: