参考了这篇博文:
https://blog.csdn.net/hai008007/article/details/80592402?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160117404419195188348022%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=160117404419195188348022&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v3~pc_rank_v2-1-80592402.first_rank_ecpm_v3_pc_rank_v2&utm_term=const%E6%8C%87%E9%92%88&spm=1018.2118.3001.4187
- const double pi = 3.14; const int * cptr = π
- int a = 10; int * const cptr = & a;
1语句表明cptr是一个int类型的指针,const表明他是一个指向常量的指针,所以“pi”必须是一个常量,不能更改。并且,cptr也不能更改。他的作用是存放常量对象的地址。
2语句表明cptr是一个常量并且是一个int类型的指针,永远指向a,不能更改。它一定要先初始化。换句话说,cptr的值不能更改,永远是a的地址,指向a的值;但是a的值得可以自己改的。也就是说,不变的是cptr的值,而非指向的那个值。
(分辨他们的阅读技巧:只看等号左边,从右到左读,依次判断什么类型。)
我的表达有些拗口,其实不太好理解。看看大佬的解释吧。
const int * pOne; //指向整形常量 的指针,它指向的值不能修改
int * const pTwo; //指向整形的常量指针 ,它不能在指向别的变量,但指向(变量)的值可以修改。
const int *const pThree; //指向整形常量 的常量指针 。它既不能再指向别的常量,指向的值也不能修改。
理解这些声明的技巧在于,查看关键字const右边来确定什么被声明为常量 ,如果该关键字的右边是类型,则值是常量;如果关键字的右边是指针变量,则指针本身是常量。下面的代码有助于说明这一点:
const int *p1; //the int pointed to is constant
int * const p2; // p2 is constant, it can’t point to anything else
总结:
关键看指针指向的值变化还是看它本身的变化。
如果,它本身是一个用const修饰,再去说明它是一个指针的表达形式,那么说明它本身的值不能变。
如果,它显示表明是一个指针类型(此时可以理解为它已经有具体的指向的值了),再用const去修饰说明它是一个常量,那么说明它指向的值不变的。