C语言 const的使用

const 放在 * 左边还是右边,决定了谁被限定为只读。这是C/C++指针中最核心的概念之一。

⚡️ 核心区别速查

写法 含义 可读性口诀
const int *p 指向的值不可改,指针本身可以改 const 在 * 左 → 锁数据
int * const p 指针本身不可改,指向的值可以改 const 在 * 右 → 锁指针
const int * const p 值和指针都不可改 两边都有 → 全锁

💡 黄金法则(从右向左读) :

遇到 const,看它修饰的是谁。const 紧邻 * 左侧修饰数据,紧邻 * 右侧修饰指针变量本身。

🔍 详细对比

1. const int *p(常量指针 / Pointer to const)
c 复制代码
const int *p = &a;
*p = 10;   // ❌ 编译错误!不能通过p修改指向的值
p = &b;    // ✅ 合法!p可以指向别的地址
  • 典型用途 :函数参数中防止意外修改传入的数据

    c 复制代码
    void print(const char *str);  // 承诺不会修改str指向的字符串
2. int * const p(指针常量 / Const pointer)
c 复制代码
int * const p = &a;
*p = 10;   // ✅ 合法!可以通过p修改值
p = &b;    // ❌ 编译错误!p不能再指向别处
  • 典型用途 :硬件寄存器映射、固定缓冲区指针

    c 复制代码
    int * const UART_REG = (int *)0x40001000;  // 永远指向这个地址
3. const int * const p(双重锁定)
c 复制代码
const int * const p = &a;
*p = 10;   // ❌ 不能改值
p = &b;    // ❌ 不能改指向

⚠️ 常见误区澄清

误区 正解
"const int *p 和 int const *p 不同" ❌ 完全相同! const 在类型名前后等价
"const 放在最左边就一定是修饰数据" ✅ 对 const int *p 成立,但要记住本质是 const 与 * 的相对位置
"int const * const p 语法错误" ❌ 合法!等价于 const int * const p

🧠 终极记忆技巧:"左数右针"

复制代码
const int * p;
 ^^^^^^^^   ← const在*左边 → 锁定"数"据

int * const p;
      ^^^^^ ← const在*右边 → 锁定"针"指

或者用从右向左阅读法解析任何复杂声明:

复制代码
const int * const p
        ↑       ↑
     "指向const int"  "p本身是const"
→ p是一个const指针,指向const int
相关推荐
0+1112 小时前
Linux --从 poll 到 epoll多路转接
linux·服务器·1024程序员节
青瓦梦滋3 小时前
WebSocket协议
linux·服务器·网络·c++·websocket·网络协议·http
桌面运维家3 小时前
旧电脑跑不动课程软件,VDI云桌面怎样接着用?
运维·服务器·虚拟化·pve·vdi·云桌面
zhang133830890753 小时前
传统机械三杯式风速传感器易磨损冻堵?CG-88金属超声波风速风向传感器给出免运维方案
运维·服务器·网络·人工智能·自动化
知已难寻4 小时前
第 2 篇 · 云的地基:服务器、存储、网络三大基础设施
运维·服务器·网络·云原生·云计算·负载均衡·1024程序员节
wangchunyu1144 小时前
JAVA CompletableFuture异步编程实战
java·开发语言·python
paopaokaka_luck5 小时前
流浪动物救助与收养系统(DeepSeek AI对话、 ECharts多维分析、救助流程衔接、领养与回访衔接、 捐赠确认与公示、志愿者协作)
java·前端·javascript·人工智能·mysql·echarts·推荐算法
Thomas.Sir5 小时前
第9课:SpringBoot4.x Web开发基础:WebMvc自动配置、静态资源、请求参数接收
java·spring boot
程序 代码狂人5 小时前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
2501_944521596 小时前
Deepmerge 跨端三方库仓颉适配全流程
java·python·eclipse·github