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
版本中隐式转换。