【C++基础】指针常量 | 常量指针 | int* p | const int* p | int* const p| const int* const p

const 修饰指针时常常让人感到困惑:const 到底修饰的是指针,还是指针所指的值?

一、先了解什么是指针

在 C++ 中,指针是一个变量,它的值是另一个变量的地址:

cpp 复制代码
int a = 10;
int* p = &a;

这表示:p 是一个指向 int 类型的指针,它保存了 a 的地址。

二、指针与 const 的四种组合

1. int* p;

普通指针:既可以修改指向的地址,也可以通过它修改值。

cpp 复制代码
int a = 10;
int b = 20;
int* p = &a;
*p = 100;   // 修改 a 的值
p = &b;     // 修改指向

2. const int* p;

指向常量的指针:不能通过指针修改值,但可以修改指向。

✅ 指针可以变

❌ 值不可以改

cpp 复制代码
int a = 10;
const int* p = &a;
// *p = 100;   // ❌ 错误:不能修改 a 的值
p = nullptr; // ✅ OK:可以修改指向

3. int* const p;

常量指针:指针一旦初始化后不能改指向,但可以修改值。

❌ 指针不能变

✅ 值可以改

复制代码
int a = 10;
int* const p = &a;
*p = 100;   // ✅ OK:可以修改 a 的值
// p = &b;  // ❌ 错误:不能修改指向

4. const int* const p;

指向常量的常量指针:既不能修改指向,也不能通过它修改值。

❌ 指针不能变

❌ 值不能改

cpp 复制代码
int a = 10;
const int* const p = &a;
// *p = 100;  // ❌ 错误:不能修改值
// p = &b;    // ❌ 错误:不能修改指向

三、如何判断 const 修饰的是谁?

const 在 * 左边:修的是值;const 在 * 右边:修的是指针本身。

声明 含义
const int* p 值不能变,指针能变
int* const p 值能变,指针不能变
const int* const p 值和指针都不能变

四、真实应用场景举例

函数参数保护数据:

cpp 复制代码
void printData(const int* data)
{
    // 不允许修改 data 指向的内容,安全性高
}

函数内部固定资源:

cpp 复制代码
void useBuffer()
{
    static int buffer[10];
    int* const ptr = buffer; // 不允许 ptr 改变指向,防止意外错误
}
修饰形式 能否修改值 能否修改指向 常见用途
int* p 普通指针
const int* p 只读访问
int* const p 固定地址,值可变
const int* const p 完全保护,不可变
相关推荐
AA陈超1 小时前
虚幻引擎5 GAS开发俯视角RPG游戏 P06-14 属性菜单 - 文本值行
c++·游戏·ue5·游戏引擎·虚幻
云知谷1 小时前
【经典书籍】C++ Primer 第15章类虚函数与多态 “友元、异常和其他高级特性” 精华讲解
c语言·开发语言·c++·软件工程·团队开发
weixin_582985182 小时前
OpenCV cv::Mat.type() 以及类型数据转换
c++·opencv·计算机视觉
oioihoii5 小时前
深入理解 C++ 现代类型推导:从 auto 到 decltype 与完美转发
java·开发语言·c++
报错小能手5 小时前
项目——基于C/S架构的预约系统平台 (1)
开发语言·c++·笔记·学习·架构
lingran__5 小时前
算法沉淀第十天(牛客2025秋季算法编程训练联赛2-基础组 和 奇怪的电梯)
c++·算法
oioihoii7 小时前
当无符号与有符号整数相遇:C++中的隐式类型转换陷阱
java·开发语言·c++
Yupureki7 小时前
从零开始的C++学习生活 13:红黑树全面解析
c语言·数据结构·c++·学习·visual studio
2401_876221347 小时前
Euler
c++·数学·算法
赵杰伦cpp9 小时前
C++的继承机制精讲
java·开发语言·c++·后端