精华——区分方法
从变量名出发,自右向左看,看看是先指针还是先常量
例如
常量指针——const pointer
int * const p 变量名是p,向左看,先看到const ,我们就知道p是个常量,然后再看到* ,我们就知道p是个常量指针——const pointer
常量指针意味着p的指向不能变,但是p指向的变量的值可以改变
int a=2;
int b=3;
int * const p=&a;//注意,常量指针必须初始化
cout << *p << endl; //这里输出2
//p=&b; //报错,常量指针指向不可变
a=123;
cout << *p << endl; //这里输出2
指针常量——pointer to const
int const * p 变量名是p,向左看,先看到* ,我们就知道p是个指针,然后再看到const ,我们就知道p是个指针常量——指向常量的指针——pointer to const
同理,const int * p 也是一个道理,p是个指针常量,分析方法同上
说白了指针常量误以为自己指向的是一个常量,但实际上指向的不一定是常量,指针常量用于指向常量,但不一定非得指向常量
指向一个常量意味着指向的常量不可修改,也就是说指针的提领操作部分
会受到限制,你只能提取指向的内存块中的值,而不能改动指向的
内存块中的值
int a=1;
int b=2;
int const * p1=&a;
const int * p2=&a; //p1和p2指向的是同一块内存,两者的性质也是一样的
cout << "*p1=" << *p1 << " " << "*p2=" << *p2 << endl;//输出a的值
*p1=213;//报错,因为编译器认为该指针指向的是一个常量,不能修改一个常量的值
//可以换指向
p1=&b;
cout << "换完指向后*p=" << *p1 << endl;//输出b的值
注意看两次报错的内容,一次是read-only p 另一次是read-only *p ,这也就是两者的区别,一种是指针自身就是一个常量,另一种是指针指向一个常量。
一个是不能换指向,但指向的值可以换——常量指针 一个是能换指向,但是当前指向的值不能改——指针常量
顶层const和底层const
最后补充一个知识点:顶层const指的是常量指针,指针自身是一个常量 底层const指的是指针指向一个常量,也就是指针常量。
结束~~~
PS:关注我,不迷路~~~
|