一、核心概念区分
1. 常量指针(Pointer to Constant)
- 语法:
const int *p或int const *p - 特性:指针本身可以改变指向,但不能通过该指针修改指向的数据
- 应用场景:保护传感器校准值、固定配置参数等,防止代码意外修改
2. 指针常量(Constant Pointer)
- 语法:
int *const p - 特性:指针的指向固定,不能改变,但可以通过指针修改指向的数据
- 应用场景:固定硬件地址、专用寄存器访问等
3. 双重保护指针
- 语法:
const int *const p - 特性:指针指向和指向的数据都不可修改,用于只读固定参数
- 应用场景:嵌入式中读取固定寄存器地址、设备出厂校准常量等
二、代码示例详解
示例1:常量指针的使用
#include <stdio.h>
int main(void)
{
int a = 10, b = 20;
// 常量指针:数据不可改,指针可换指向
const int *p1 = &a;
// *p1 = 99; // 报错:禁止修改数据
p1 = &b; // 合法:可以改变指针指向
printf("*p1 = %d\n", *p1); // 输出20
return 0;
}
解析:const int *p1 中,const 修饰的是 *p1,即指针指向的数据,所以不能通过 *p1 修改数据,但指针本身可以指向其他变量。
示例2:指针常量的使用
#include <stdio.h>
int main(void)
{
int a = 10, b = 20;
// 指针常量:指针指向固定,数据可修改
int *const p2 = &a;
*p2 = 99; // 合法:可以修改指向的数据
// p2 = &b; // 报错:不能更换指向
printf("a = %d\n", a); // 输出99
return 0;
}
解析:int *const p2 中,const 修饰的是 p2,即指针本身,所以指针的指向不能改变,但可以通过 *p2 修改指向的数据。
示例3:双重保护指针的使用
#include <stdio.h>
int main(void)
{
int a = 10;
// 双重保护:指针指向和数据都不可改
const int *const p3 = &a;
// *p3 = 99; // 报错:禁止修改数据
// p3 = &a; // 报错:不能更换指向
printf("*p3 = %d\n", *p3); // 输出10
return 0;
}
解析:const int *const p3 中,两个 const 分别修饰了指针和指向的数据,所以两者都不能修改。
三、记忆口诀与区分技巧
记忆口诀
const靠近谁,谁就不能改
const int *p:const靠近int,所以指向的数据不能改int *const p:const靠近p,所以指针本身不能改const int *const p:两个const分别靠近int和p,所以两者都不能改
快速区分方法
看 const 与 * 的相对位置:
const在*左边:常量指针,数据不可改const在*右边:指针常量,指针不可改
四、嵌入式开发中的实际应用
1. 常量指针的应用
在嵌入式开发中,常量指针常用于保护传感器校准值、设备配置参数等。例如:
// 保护温度传感器校准值
const int *temp_calibration = &calibration_value;
// 防止代码意外修改校准值
// *temp_calibration = 25; // 编译报错
2. 指针常量的应用
指针常量常用于固定硬件地址,例如:
// 固定LED寄存器地址
volatile unsigned int *const led_reg = (unsigned int *)0x40020000;
// 只能通过该指针操作LED寄存器,不能改变指向
*led_reg = 0x01; // 合法:点亮LED
// led_reg = (unsigned int *)0x40020004; // 编译报错
3. 双重保护指针的应用
双重保护指针常用于读取只读寄存器、设备出厂校准常量等,例如:
// 读取设备ID寄存器(只读)
const unsigned int *const device_id_reg = (unsigned int *)0x1FFFF7E8;
// 只能读取,不能修改
unsigned int device_id = *device_id_reg;
// *device_id_reg = 0x12345678; // 编译报错
// device_id_reg = (unsigned int *)0x1FFFF7EC; // 编译报错
五、总结
| 类型 | 语法 | 指针指向 | 指向数据 | 应用场景 |
|---|---|---|---|---|
| 常量指针 | const int *p | 可修改 | 不可修改 | 保护配置参数、传感器校准值 |
| 指针常量 | int *const p | 不可修改 | 可修改 | 固定硬件地址、专用寄存器 |
| 双重保护指针 | const int *const p | 不可修改 | 不可修改 | 只读寄存器、出厂校准常量 |
掌握常量指针和指针常量的区别,不仅能避免代码中的常见错误,还能提高代码的安全性和可维护性,是嵌入式开发中必须掌握的核心知识点。

1170

被折叠的 条评论
为什么被折叠?



