为了账号安全,请及时绑定邮箱和手机立即绑定

关于 const int *p=&x;的问题

const int *p=&x;

关于这个老师给的讲解是,p可以指向其他位置,但是*p的值是不能变的。

那么对于如下代码

int main(void)
{
     int x = 10 , y = 20;
     const int *p = &x;
     cout << *p << endl;
     p = &y;
     cout << *p << endl;
     system("pause");
     return 0;
}

输出的两次*p的值分别是10和20,那么这在间接程度上改变了*p的值,不与【*p值不变】这样的设定相违背吗》


正在回答

2 回答

准确地表达应该是:p是一个指向const int型变量的指针,所以p无法修改其指向的int对象。但p本身不是const的,所以能被改变(也就是可以指向别的int)。*p是解引用p以得到p指向的对象。

代码中第一个*p得到x,但只是用来读取x的值,并没有修改x的内容。然后代码将y的地址赋予了p,再次*p时就得到了y,同样代码中也没有更改y的内容,所以说没有改变*p的值。  那个讲解只说“*p”容易会引起理解上的歧义。


还应该注意到一点:p是一个指向const int的指针,说明p可以指向const int对象,也可以指向普通的int对象。只不过通过p来访问指向的int对象时,编译器会将这个对象当作const对象(因为p类型本身就是指向const对象的),你无法修改它的内容。 示例中的就是这种情况,x和y都是普通的int,但*p无法更改它们的内容。

1 回复 有任何疑惑可以回复我~
#1

ShadowKid 提问者

非常感谢!
2015-06-25 回复 有任何疑惑可以回复我~
#2

ShadowKid 提问者

指针可以改变指向的地址,但是对应地址里的值通过*p操作无法改变,是这个意思吧?
2015-06-25 回复 有任何疑惑可以回复我~
#3

onemoo 回复 ShadowKid 提问者

是的。 因为这个指针是指向const对象的,从指针角度来说,所指的内容就是const的,即便其所指的对象原本并非const。 所以你无法通过*p来修改它。
2015-06-25 回复 有任何疑惑可以回复我~

首先这里const修饰的是只读变量而非常量,也就是说本质上还是一个变量。

这里*p是只读变量,无法直接赋值改变,但p所指向的内存地址是可变的,所以可以通过改变p指向的地址来改变*p的值,但不能直接给*p赋值来改变。貌似不矛盾吧。

0 回复 有任何疑惑可以回复我~
#1

ShadowKid 提问者

谢谢同学的回答!
2015-06-25 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
C++远征之离港篇
  • 参与学习       122700    人
  • 解答问题       474    个

C++扫清通往面向对象的最后一道障碍,将所有知识点融会贯通

进入课程

关于 const int *p=&x;的问题

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信