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
相关推荐
开开心心就好1 小时前
视频压缩工具推荐,绿色版免安装双击即用
java·前端·人工智能·spring·智能手机·intellij-idea·excel
Wang's Blog1 小时前
Java框架 SpringCloud 快速入门: Eureka 注册中心的搭建
java·spring cloud·eureka
JEECG低代码平台1 小时前
不买服务器也能异地组网:开源 P2WLAN 把两地电脑“插“进同一台路由器
运维·服务器·开源·开源软件
专业程序开发源1 小时前
springboot古城景区管理系统88564-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·php·课程设计
泡茶喝茶写代码1 小时前
A股量化数据工程:从 REST 接口到策略信号(第 7 篇):盈利能力因子:毛利率、净利率与 ROE
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
cehuishi95271 小时前
测绘外业调查如何正确的开展
运维·服务器·网络
小蒜学长1 小时前
基于微信小程序的遇见咖啡店点餐系统设计与实现(代码+数据库+LW)
java·spring boot·后端·微信小程序·咖啡店点餐系统
py有趣1 小时前
硬件SPI和软件模拟SPI在配置方面的一点区别
c语言·stm32·单片机
lisanmengmeng1 小时前
NRPE 添加命令(三)
java·linux·服务器