c++中const int* p(p指向的值并不是一定不可修改)和int * const p的理解

对于const int* p 和 int *const p的区别往往让人感到傻傻分不清楚。

我分别这两者主要看*和const的位置,const在*左边即修饰指针指向的值不可改变,在*右边即修饰指针p,代表p不能修改。

这里有个有意思的情况,当cosnt int * p = &b时。

1.   对于指针p如果进行操作*p = 5;进行赋值,编译器会报错,表示不能进行修改。那么是不是意味着b的值就不能修改了呢?

对于这个问题进行下面操作:

    int b = 9;
	const int* p = &b;
	cout << "p地址 :" << p << "    *p: " << *p << endl;
	int *pp = &b;
	*pp = 10;

	cout << "pp地址:" << pp << "    *pp: " << *pp << endl;
	cout << "p地址 :" << p << "    *p " << *p << endl;



    vs2013输出信息:

    p地址 :0019F95C    *p: 9
    pp地址:0019F95C    *pp: 10
    p地址 :0019F95C    *p 10
    请按任意键继续. . .

从这个结果来看,b的值实际是被修改了,因为最后*p的值也变为了10。这是什么原因造成的呢?

在我看来,因为b实际是保存在一块内存0019F95C中,而指针p,pp只是指向了这块内存,const的作用域其实也仅仅是限制p指针不能修改,而对于其他指向b的指针const并不能进行限制,也就是说p不能修改b的值,但不影响其他指向b的指针例如pp去修改b,而当pp修改了b的值以后,由于内存0019F95C中的值编程了10,所以*p的值也就变为了10。

 

常量指针是指向常量的指针,指针指向的内存地址的内容是不可修改的(这句话是引用其他博客的定义)。

这个定义是比较常用的定义,但是会出现歧义,“内容是不可修改的”到底是都不可修改,还是只是当前指针不能修改表述的不是很明确,因此才会出现文章开头的疑问。

常量指针是指向常量的指针,指针指向的内存地址的内容(对于当前指针来说)是不可修改的。

我在原定义的基础上加限定词,这样可以最大限度的消除歧义,也能更好的理解。

 

2.   对于int* cosnt p,这个表述是在限定p所在的内存的内容,程序可以看出,p和pp所在的内存的值都是0019F95C,这个值是b的内存地址。指针指向对象的改变其实质就是对指针所在内存的值得改变(指针内存中保存的值即指向对象的地址)。

int * const p = &b其实就是限定p所在内存保存的值只能是b的地址(0019F95C),通过这种方式确保p不会再指向其他的对象。

 

以上阐述都是基于自己的理解,如有错误的地方请各位留言告知,以便及时修改。谢谢。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值