一、const与指针一起使用
const与指针同时使用主要分为两种情况:(1)指针指向的内存地址里装的内容是不能被修改的。(2)指针只能指向一个初始地址,不能再指向其他地址。
(1)指针指向的是const类型的,它的意思是指针指向的内存里的内容是不能通过指针被修改的。它有两种写法。
const int* p; (推荐)
int const* p;
这两种写法的意思是一样的,前一种比较推荐。它的意思是指针p所指向的内容是const int类型的。即p所指向的内容是不能改变的。严格来说,应当是p所指向的内存所装的内容,是不能通过指针p来改变的。下面举个例子,
1 const int* p1; 2 int const* p2;// 3 int a=1,b=2; 4 p1=&a;//正确 5 p2=&b;//正确 6 cout<<*p1<<*p2<<endl;//此时*p1=1,*p2=2; 7 *p1=3;//编译错误,*p1的值不可以被改变 8 a=6; 9 cout<<*p1<<endl;//此时,*p1=6,可见p1所指向的内存里装的值仍然可以被改变的,只是不能通过指针p1来改变而已。
通过上述例子可以看出,其实p1所指向的那块内存的值是可以改变的,只不过不允许通过指针p1来改变而已。
(2)const指针,它只有一种写法:
int* const p=&a; (因为指针本身的值是不能被修改的所以它必须被初始化)
这种形式可以被理解为:p是一个const的指针(不能再指向其他地址了),这个指针是指向int 类型的。它指向的值是可以被改变的如*p=3(这时,a的值也被赋为了3);但指针本身是不能改变的,即p=&b是不允许的。
(3)指针本身和它指向的内容都是不能被改变的。比如:
const int* const p=&a;
int const* const p=&a;
上面两种写法是一样的,(3)是(1)和(2)的一个综合写法。
区分以上三点有个规律:指向const的指针(指针指向的内容不能被修改)const关健字总是出现在*的左边,而const指针(指针本身不能被修改)const关健字总是出现在*的右边,那不用说两个const中间加个*肯定是指针本身和它指向的内容都是不能被改变的。
最后,给出一段总的代码,来验证以上3个方面
#include <iostream> using namespace std; int main(int argc, char *argv[]) { int a=3; int b; /*定义指向const的指针(指针指向的内容不能通过指针被修改)*/ const int* p1; int const* p2; /*定义const指针(由于指针本身的值不能改变所以必须得初始化)*/ int* const p3=&a; /*指针本身和它指向的内容都是不能被改变的所以也得初始化*/ const int* const p4=&a; int const* const p5=&b; //(1)------------------------------------------------------------ p1=p2=&a; //正确 *p1=*p2=8; //错误,编译不通过(指针指向的内容不能被修改) a=4; cout<<*p1<<endl;//*p1=4,不通过指针p1,用其他方式是可以修改这块内存的。 //(2)------------------------------------------------------------ p3=p1; //错误,编译不通过(指针所指向的内存地址不能被更改) *p3=5; //正确,指针所指向的内存里装的值是可以变的 cout<<*p3<<a<<endl;//输出*p3和a的值都是5,变量a的值也跟着指针被修改了。 //(3)------------------------------------------------------------ p4=p5;//错误,编译不通过 (指针本身和它指向的内容都是不能被改变) *p4=*p5=4; //错误,编译不通过(指针本身和它指向的内容都是不能被改变) return 0; }
参考博客:http://www.cnblogs.com/younes/archive/2009/12/02/1615348.htm,感谢相关博主。