常量指针的混淆[重复]

Posted

技术标签:

【中文标题】常量指针的混淆[重复]【英文标题】:confusion on constant pointer [duplicate] 【发布时间】:2017-08-19 17:05:05 【问题描述】:
int p=10;           
const int * ptr=&p;        // expression 1

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

所以如果我写

*ptr=10;

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

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

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

【问题讨论】:

你必须先了解什么是常量指针和指向常量的指针 const 限定符是指针的属性,而不是被指向的东西。 const int * 表示不能(不应该)通过这个指针改变数据。数据本身可能是恒定的,也可能不是恒定的。 表达式1表示不能使用该指针修改数据。它并没有告诉指针指向的数据是常量。 @HolyBlackCat 感谢您清除我的错误概念 【参考方案1】:

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

指向的数据不一定真的 const(=最初声明为const),如果不是,则非const指向它的指针(包括原始的const -pointer cast to its non-const 版本)可能会改变它。

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

【讨论】:

【参考方案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 版本中进行隐式转换。

【讨论】:

感谢大佬澄清了我的错误概念

以上是关于常量指针的混淆[重复]的主要内容,如果未能解决你的问题,请参考以下文章

指针常量&常量指针&指向常量的指针常量

常量指针指针常量指向常量的指针常量 的区别(转帖)

指针常量常量指针和指向常量的常量指针

指针和引用指针常量与常量指针

指针常量和常量指针

理解常量指针与指针常量?