参考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不能;