int p=10;
const int * ptr=&p; // expression 1
据我所知,表达式1指针ptr指向的数据是常数
所以,如果我写
*ptr=10;
无效, 但如果我采取另一个指针变量,如
int * pr=&p;
*pr=19;
cout<<*ptr;
会给我输出19 所以现在ptr指出的数据发生了变化 但早些时候我们已经看到ptr指出的数据是恒定的 为什么数据被另一个指针变量改变了?
答案 0 :(得分:2)
const int * ptr=&p;
表示ptr
指向的数据为const
,但仅相对于该指针。
指向的数据不一定是真的 const
(=最初声明为const
),如果不是,则非const
指向它(包括转换为非const版本的原始const指针)可能会改变它。
如果某些数据确实是const
,则尝试通过非const
指针修改它会导致未定义的行为。
答案 1 :(得分:2)
这是非常基本的,所以我的建议是阅读一本基本的C ++书籍。 尽管如此,我还是会提供答案。
int p = 10;
这是一个声明和定义p
类型int
的变量的语句。
可以修改此变量的内容。那是因为变量p
不是 const。
显然后面的语句p = 13;
仍然有效,它为该变量赋值。
现在你有了这个:
const int* ptr = &p;
您正在定义一个名为ptr
的指针,该指针指向该变量。
将限定符const
添加到指针只是意味着无法通过指针本身的访问来修改变量的内容。
换句话说,指针只能用于(例如)读取p
的值。
另一方面:
int* pr = &p;
定义了一个不再const
限定的指针。
实际上,您可以通过使用该指针本身来访问和修改变量p
的内容。 (*pr = 19;
是有效的陈述)。
有点远......
这是“更复杂的世界”背后的一般理念。
声明:
const int* ptr = &p;
这是可能的,因为a变量可以在其const
版本中隐式转换。