常量指针上的混乱

confusion on constant pointer

本文关键字:混乱 指针 常量      更新时间:2023-10-16
int p=10;           
const int * ptr=&p;        // expression 1

据我通过表达式 1 的理解,指针 ptr 指向的数据是常数

所以如果我写

*ptr=10;

这是无效的, 但是如果我采用另一个指针变量,例如

int * pr=&p;
*pr=19;
cout<<*ptr;

会给我输出 19 所以现在 PTR 指向的数据发生了变化
,但之前我们已经看到 PTR 指向的数据是恒定的
,为什么数据会被另一个指针变量改变?

const int * ptr=&p;表示ptr指向的数据是const,但仅相对于该指针。

指向的数据不一定是真正const的(=最初声明const(,如果不是,指向它的非const指针(包括原始的常量指针转换为其非常量版本(可能会更改它。

如果某些数据确实const,则尝试通过非const指针修改它会导致未定义的行为。

这是非常基本的,所以我的建议是阅读一本基本的C++书。 尽管如此,我还是会提供答案。

int p = 10;

它是一个声明和定义一个名为p的变量的语句,类型为int可以修改此变量的内容。这是因为变量p不是常量。

显然,后面的语句p = 13;仍然有效,它为该变量分配了一个新值。

现在你有这个:

const int* ptr = &p;

您正在定义一个名为ptr的指针,该指针指向该变量。 将限定符const添加到指针仅意味着您无法通过访问指针本身来修改变量的内容。

换句话说,指针只能用于(例如(读取p的值。

另一方面:

int* pr = &p;

定义一个不const限定的指针。

实际上,您可以通过使用该指针本身来访问和修改变量p的内容。(*pr = 19;是一个有效的陈述(。


有点远...

这是"更复杂的世界"背后的总体思路。

声明:

const int* ptr = &p;

这是可能的,因为 A 变量可以在其const版本中隐式转换。