这里不去区分中文到底谁是指针常量与常量指针,因为记住也没啥用。
1. 首先区分读法概念
按照从左至右的顺序记忆,按照从右至左的顺序理解。
参考《Effective c++》Item21上的做法,如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。
记忆
只关注【const】 和 【*】 的先后顺序,从做到右的顺序读就行,const读做常量,*读做指针。
const int * p;//常量指针
int * const p;//指针常量
int const * p;//常量指针
理解
const int * p; // 指针p 指向一个const
int * const p; // 指针常量p 指向一个 int
int const * p; // 指针p指向一个const
2.常量指针
现在声明指向常量的指针ptr
【常量指针:指针可以指向别的地址,但是不能通过该指针修改指向的值】
int age = 18;
const int *ptr = &age;
这里的意思是:ptr指向一个const int,也就是说不能通过ptr去修改age这个值,换句话说就是ptr的值是const* 不能修改。
*ptr+=1;//是错误的
重点来了:ptr的声明并不意味着他指向的值实际是一个常量值,也就是说age只是一个整型变量而已,可以直接通过 age = 19 来修改age的值。这里只是相对于ptr而言,age是常量,不能通过ptr去修改age的值。
int anotherAge = 30;
*ptr = 20;//错误,不能通过该指针修改其指向的值
age = 20;//正确
ptr = &anotherAge;//正确,可以指向其他的地址
3.指针常量
可以修改指针指向的值,但是禁止改变指向的变量
int sage = 20;
int hapi = 30;
int *const pt = &sage;
*pt = 29;//正确
pt = &hapi;//错误