对常量指针的混淆

时间:2017-08-19 17:05:06

标签: c++ pointers const

int p=10;           
const int * ptr=&p;        // expression 1

据我所知,表达式1指针ptr指向的数据是常数

所以,如果我写

*ptr=10;

无效,  但如果我采取另一个指针变量,如

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

会给我输出19   所以现在ptr指出的数据发生了变化  但早些时候我们已经看到ptr指出的数据是恒定的    为什么数据被另一个指针变量改变了?

2 个答案:

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