博客主页:Skylar Lin
望本文能够给您带来一定的帮助,如果有错误的地方敬请斧正!
新人博主🧑,希望多多支持🍺,还有好多库存和大家分享🎁。
转载需注明出处和原作🌹。
常量指针
即一个指针指向一个常量对象的地址;指向常量的指针不能用于改变其对象的值。
const double pi = 3.14; // pi 是一个常量
const double *ptr = π // ptr 是一个常量指针
*ptr = 42; // 错误,不能改变其对象的值
虽然我们说:指针的类型与其指向的对象的类型必须匹配;但是有两个例外。
其一是允许“常量指针”指向一个非常量对象,另外一个是“常量引用”。
double xi = 3.14;
const double *ptr = ξ // ptr 指向非常量对象
// 注意:xi 必须与 ptr 一样是 double
和常量引用一样,指向常量的指针仅仅要求不能通过该指针改变其对象的值,而没有规定那个对象不能通过其他途径改变。
指针常量
指针常量必须初始化,而且一旦初始化完成,其指向就不能再改变了。
double pi = 3.14;
double *const ptr = π // ptr 是一个指针常量
*ptr = 5.20; // 正确,可以修改其指向的对象的值
把 *
放在 const
之前,说明该指针本身就是一个常量。
如果是 const 既修饰 指针 又修饰 数据类型 的情况,则不能改变指向也不能改变指向的对象的值。
int a = 10;
int b = 20;
//const既修饰指针又修饰常量
const int *const p = &a;
// p = &b; //错误
//*p = 100; //错误
区分常量指针和指针常量
区分技巧 1: 看 const 右侧紧跟着的是 指针 还是 数据类型,是指针则为常量指针,否则为指针常量。
区分技巧 2:常量指针本身为指针,肯定可以改变指向;指针常量本身为常量,不能改变指向。
如果要用专业名词来区分的话,那便是顶层 const 和 底层 const 了。
顶层 const 表示指针本身是一个常量,底层 const 表示指针指向的对象是一个常量。
更广泛的,顶层 const 可以表示任意对象是常量,这一点对于任意数据类型都适用。
int i = 10;
int *const p1 = &i; // 不能改变 p1 的值(即p1指向),因为这是一个 顶层const
const int ci = 24; // 不能改变 ci 的值,因为这是一个 顶层const
const int *p2 = &ci; // 允许改变 p2 的值(即p2指向),因为这是一个 低层const
const int &r = ci; // 允许改变 r 的值,因为这是一个 低层const