首页 > 编程笔记

C++ const指针(const修饰指针)详解

const 是一个常量修饰符,使用 const 修饰一个变量时,该变量的值就不允许改变了。

例如:
const int num = 5;
num = 10; // 错误,num 的值不能修改
const 也可以用来修饰指针变量,它既可以限制指针变量本身,也可以限制指针指向的数据。

1、const限制指针变量本身

所谓 const 限制指针变量本身,既指针变量的值不允许改变,也就是指针的指向不允许改变。

const 限制指针变量本身的语法格式如下:
类型 * const 指针变量名;
例如:
int a;
int * const p = &a;
这样定义的指针 p,它的指向不能改变,比如说:
*p = 1; // 正确,修改指针指向的数据

int b;
p = &b; // 错误,指针的指向不能改变
因为不能修改指针的指向,所以在定义的时候必须为指针设置一个初值。下面的定义是错误的:
int * const p; // 错误,指针没有初值

2、const限制指针指向的数据

用 const 限制指针指向的数据,既指针变量本身是可以改变的(指针的指向可以改变),但指针不能修改它指向的数据。

const限制指针所指数据的语法格式如下:
const 类型 * 指针变量名;
类型 const * 指针变量名;
例如:
const int *p;
int const *p;
在上面的定义中,* 表明 p 是一个指针变量,int 表明 p 是一个指向整型数据的指针,而 const 则限制指针不能修改它所指的数据。

如下的程序演示了 const 限制指针所指的数据:
int a = 0, b = 0;
const int* pa = &a; // 定义 const 指针,令其指向 a。
pa = &b;            // 正确,pa 的指向可以改变
*pa = 1;            // 错误,pa 不能修改它指向的数据
b = 2;              // 正确,变量 b 的指可以改变。
在上面的代码中,试图修改 *pa 是错误的,因为 const 限制指针不能修改它所指的数据。

注意,虽然不能通过 pa 改变它所指的数据,但 b 变量本身是能修改的,通过 pa 修改 b 的值和直接修改 b 的值是两码事。

3、const限制指针本身和它所指的数据

上面讲述了 const 在两个位置的不同效果,const 还可以同时出现在这两个位置,其定义格式为:
const 类型 * const 指针变量名;
这是前面两种情况的组合,指针变量的指向不能改变,同时指针也不能修改它所指的数据。

例如:
int a = 0, b = 0;
const int* const p = &a;
*p = 1;   // 错误,指针不能修改它所指的数据
p = &b;   // 错误,指针的指向不能改变

总结

const 和指针结合的写法多少有点让初学者摸不着头脑,大家可以这样来记忆:const 离变量名近就是用来修饰指针变量的,离变量名远就是用来修饰指针指向的数据,如果近的和远的都有,那么就同时修饰指针变量以及它指向的数据。

推荐阅读