关于这两个概念是特别容易混淆的,也是不太好理解与记忆的;在此给出自己的理解与记忆方式,方便大家相互学习。
指针常量
指针常量:本质是一个常量(重点在于后面两个字 "常量");
指针所存储的内容(或者说 指针的值):是一个地址;那么 指针常量 即表明:该指针的值是常量,其所指向的地址是不能随意改动的;但是所指向地址上的内容是可以改动的;
int a = 3;
int b = 4;
int *const p = &a; // p 为 指针常量,指向整形变量a, 其值为 a 变量的地址;
p = &b; // error, p 的值不能随意更改,已经指向了 a 变量的地址,不能再指向其他变量了;
*p = 10; // ok, p 虽然是指针常量,但它所指向的那个地址上的内容即 int a 是个变量,a 的值是可以修改的
正如上图最后一行代码:*p = 10 ,通过这种方式来修改 a 变量的值是 ok 的。
指针常量 ----> int *const p;(记忆方式:从左往右读,先是指针*,后是常 const,最后是变量名称,const 在 * 的右侧)
常量指针
常量指针:本质是一个指针(重点在于后面两个字 "指针")
常量指针:指向的是一个常对象,不可修改的对象;即其所指向地址上的内容是不可以随意修改的;但是常量指针 本身是一个指针,是个变量,也就意味着它的指向是可以随意改变的;既可以指向这个常对象,又可以指向别的常对象;
int a = 4;
int b = 8;
const int *p = &a; // p 为常量指针,指向常对象 a 变量;
*p = 40; // error p 所指向的是常量对象,不可以通过该 指针 修改所指向变量的内容;
p = &b; // ok, 可修改指针的指向,将 p 指向变量 b 是可以的;
常量指针 ----> const int *p 或 int const* p (记忆方式:也是从左往右读,先是常 const ,后是指针 *, const 在 * 的左侧)
还有一种是,指针的指向以及所指向的内容都是不能改变的指针,形如:
const int * const p; or int const * const p;
int a = 4;
int b = 6;
int const *const qq = &a; // qq 的指向以及所指向的内容都不能改变
*qq = 45; // error 不能改变所指向地址上的内容
qq = &b; // error 不能改变指向