55.C语言中常量指针与指针常量的深度解析:嵌入式防篡改参数必学

一、核心概念区分

1. 常量指针(Pointer to Constant)

  • 语法const int *pint 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 *pconst 靠近 int,所以指向的数据不能改
  • int *const pconst 靠近 p,所以指针本身不能改
  • const int *const p:两个 const 分别靠近 intp,所以两者都不能改

快速区分方法

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不可修改不可修改只读寄存器、出厂校准常量

掌握常量指针和指针常量的区别,不仅能避免代码中的常见错误,还能提高代码的安全性和可维护性,是嵌入式开发中必须掌握的核心知识点。


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值