在C++
中,我们经常使用const
关键字来定义常量,这是const
的基础用法。然而,当const
与指针变量
结合起来时,情况就会变得稍稍复杂,下面讲解const
与指针变量
结合的三种形式。
常量指针
const
关键字在指针类型之前定义,我们称这种情况为常量指针
,形式如下:
int a = 10, b = 20;
const int * p = &a;
需要注意的是,常量指针的指向可以改变,但是它指向的内存中的值不能修改。这是什么意思呢?看看下面这段代码:
int a = 10, b = 20;
const int * p = &a;
// 修改指针的指向
p = &b;
// 修改指针指向的内存中的值
*p = 100; // 这段代码无法执行,编译报错
看懂了吗?p = &b;
这条语句就是修改指针p
的指向,将其指向另一个变量b
,保存b
的地址,而*p = 100;
这条语句由于const
关键字的限定,无法执行。
指针常量
指针常量
是指const
关键字写在指针类型后,指针变量前,如下所示:
int a = 10, b = 20;
int * const p = &a;
这种情况下,指针的指向无法修改,但是指针指向的值可以修改,如下所示:
int a = 10, b = 20;
int * const p = &a;
// 修改指针的指向
p = &b; // 编译报错
// 修改指针指向的值,可以执行
*p = 100;
死指针
我不确定这种情况是不是叫做死指针
,姑且就这么命名。这种情况下,在指针类型前使用const
关键字,在指针类型后、变量名前再加一个const
关键字,形式如下:
int a = 10, b = 20;
const int * const p = &a;
这种情况下,无论是指针的指向还是指针指向的值,都无法修改。也就是说:
int a = 10, b = 20;
const int * const p = &a;
// 修改指针的指向,编译报错
p = &b;
// 修改指针指向的值,编译报错
*p = 100;
总结
指针变量
与const
关键字有三种结合形式,分别为常量指针
、指针常量
和死指针
。
常量指针
:指针的指向可以修改,指针指向的值不可修改指针常量
:指针的指向不可以修改,指针指向的值可以修改死指针
:指针的指向和指针的值都不可修改