指针常量和常量指针

参考http://blog.csdn.net/beyond0525/article/details/7409305这篇文章。

主要是关于常量指针方面进一步理解。

#include <iostream>
using namespace std;

int main()
{
	int a = 1;
	int b = 2;
	int c = 3;
	int const *p1 = &b; //常量指针
	int *const p2 = &c; //指针常量
	cout<<"old vals and pooint address:"<<endl;
	cout<<" &a = "<<&a<<" a = "<<a<<endl;
	cout<<" &b = "<<&b<<" b = "<<b<<endl;
	cout<<" &c = "<<&c<<" c = "<<c<<endl;
	cout<<" &p1 = "<<&p1<<" p1 = "<<p1<<" *p1 ="<<*p1<<endl;
	cout<<" &p2 = "<<&p2<<" p2 = "<<p2<<" *p2 ="<<*p2<<endl;


	//p1 = &a;	//将a的地址给指针p1
	//b=22;		//直接改变b的值
	*p1 = a;	//直接将a的值赋值给p1会报错
	cout<<"address and values of point:"<<endl;
	cout<<" &p1 = "<<&p1<<" p1 = "<<p1<<" *p1 "<<*p1<<endl;


	return 0;
}




下面使用两种方法改变p1:

1。首先是直接将a的地址给到指针p1去改变p1,编译结果:



可以看到指针p1这个变量的内存地址是0012FF70,原始指向的地址是0012FF78,就是变量b的地址,*p1的值也是变量b的值,

在使用p1=&a将a的地址给指针p1后,p1的内存地址是0012FF70,现指向地址是0012FF7C,可以看到已经变成了变量a的地址,*p1的值也随之变成了a的值。

2。直接改变变量b的值,编译结果:



指针p1的内存地址是0012FF70,原始指向的地址是0012FF78,就是变量b的地址,*p1的值也是变量b的值,

在使用b=22给b重新赋值后,p1的内存地址是0012FF70,现指向地址是0012FF78,仍然是变量b的地址,但是由于b的值已改变,所以现在*p1就是现在的结果22。


如果使用*p1=a进行给p1赋值时,编译会报错。

综上,可以理解当p1这个常量指针指向变量b后,无法通过给*p1赋值去改变变量b的值(也就是只能通过指针去读取这个变量,而无法通过指针去改写变量,常量指针指向的内存只读不可写),而只能通过b主动改变自己的值,才能改变*p1。但是常量指针这个变量(指针也是变量,只不过这个变量存放的是地址)本身自己就是可以改变的,当改变常量指针变量的值后,实际是将这个常量指针指向了另外的一个变量。


指针常量就好理解了,当它在初始化后,指针的指向的地址就固定了,而指向的地址里面的内容是可以随意改变的。


常量指针不能使用间接引用*p1做为左值,但指针常量可以;

常量指针变量p1可以作为左值,但指针常量变量p2不能;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值