一、常量指针
形式:const int * p; 或者int const * p;
定义:就是常量的指针,指向的是一个常量,但是这个常量是指针的值,而不是地址指向的值,这里“常量”修饰的是指针的值,。
关键点:
1、常量指针指向的对象不能通过这个指针来修改,但是可以通过原来的声明来修改;
2、常量指针可以被赋值为变量的地址,但是之所以叫常量指针,是限制通过这个指针修改变量的值;
3、指针还可以指向别处,因为指针本身只是变量,可以指向任意地址。
二、指针常量
形式:int * const p;
定义:本质就是常量,用指针修饰它。
关键点:
1、指针常量指向的地址不可以变;
2、指向的内容可以变;
const int * p19 = NULL; //声明常量指针p19
int const * p19_1 = NULL;//声明常量指针p19_1
int i = 9;
p19 = &i; //常量指针指向i
p19_1 = p19;
cout << "&i=" << &i << ", i=" << i << endl;
cout << "p19=" << p19 << " , *p19=" << *p19 << endl;
cout << "p19_1=" << p19_1 << ", *p19_1=" << *p19_1 << endl;
// *p19 = 10; //error: assignment of read-only location ‘* p19’不允许修改常量指针指向的内容
i = 10;//可以通过修改指向的变量修改常量指针指向的内容
cout << "*p19" << *p19 << " " << *p19_1 << " " <<*p19_1 <<endl;
int j =8;
p19=&j; //修改常量指针指向的地址
cout << "&j=" << &j << ", j=" << j << endl;
cout << "p19=" << p19 << ", *p19=" << *p19 << endl;
int * const p20 = &i; //声明指针常量
cout << "p20=" << p20 << ", *p20=" << *p20 << endl;
//p20 = &j;//error: assignment of read-only variable ‘p20’ 不允许修改指针常量指向的地址
*p20 = j; //修改指针常量指向的内容
cout << "p20=" << p20 <<", *p20=" << *p20 << endl;
cout << "&i=" << &i << ", i=" << i << endl;
运行结果:
&i=0x7ffc4c8db7b8, i=9
p19=0x7ffc4c8db7b8 , *p19=9
p19_1=0x7ffc4c8db7b8, *p19_1=9
*p1910 10 10
&j=0x7ffc4c8db7c0, j=8
p19=0x7ffc4c8db7c0, *p19=8
p20=0x7ffc4c8db7b8, *p20=10
p20=0x7ffc4c8db7b8, *p20=8
&i=0x7ffc4c8db7b8, i=8