**指针常量(Pointer Constant)** 和 **常量指针(Pointer to Constant)**

在 C/C++ 中,指针常量(Pointer Constant)常量指针(Pointer to Constant) 是两个容易混淆的概念。它们的主要区别在于:

  • 指针本身是否可变
  • 指针指向的值是否可变

1. 常量指针(Pointer to Constant)

📌 指向常量的指针,不能修改指向的数据

语法:

const int* ptr;

或者:

int const* ptr;

特点:

  • 指针本身可变(可以指向不同的变量)。
  • 指向的值不可变(不能修改 *ptr)。

示例

int a = 10;
int b = 20;
const int* ptr = &a;  // 指向 a
ptr = &b;  // ✅ 可以改变指针指向
*ptr = 30; // ❌ 错误:不能修改指针指向的值

📌 等价于

int const* ptr = &a;

指针可以改指向,不能改指向的值!


2. 指针常量(Constant Pointer)

📌 指针本身是常量,不能修改指针的指向,但可以修改指向的值。

语法:

int* const ptr;

特点:

  • 指针本身不可变(不能指向其他变量)。
  • 指向的值可变(可以修改 *ptr)。

示例

int a = 10;
int b = 20;
int* const ptr = &a;  // 必须初始化,否则报错
ptr = &b;  // ❌ 错误:指针不能改变指向
*ptr = 30; // ✅ 正确:可以修改指针指向的值

指针不能改指向,但可以修改指向的值!


3. 常量指针常量(Constant Pointer to Constant)

📌 指针和指向的值都不能变

语法:

const int* const ptr;

特点:

  • 指针不可变(不能指向其他变量)。
  • 指向的值不可变(不能修改 *ptr)。

示例

int a = 10;
int b = 20;
const int* const ptr = &a;  // 必须初始化
ptr = &b;  // ❌ 错误:指针不能改变指向
*ptr = 30; // ❌ 错误:指针指向的值也不能修改

最严格,指针和值都不能改!


4. 总结对比

类型语法指针本身可变?指向的值可变?
常量指针const int* ptr;int const* ptr;✅ 可变❌ 不可变
指针常量int* const ptr;❌ 不可变✅ 可变
常量指针常量const int* const ptr;❌ 不可变❌ 不可变

5. 记忆技巧

  • const * 左边指针指向的值不可变常量指针
  • const * 右边指针本身不可变指针常量
  • const 两边都有指针和值都不可变

6. 例子:

#include <iostream>

int main() {
    int a = 10, b = 20;

    // 常量指针:指针可变,指向的值不可变
    const int* p1 = &a;
    p1 = &b;  // ✅ 可以改指向
    //*p1 = 30; // ❌ 错误:不能修改值

    // 指针常量:指针不可变,指向的值可变
    int* const p2 = &a;
    //*p2 = 30; // ✅ 可以修改值
    //p2 = &b;  // ❌ 错误:指针不可修改

    // 常量指针常量:指针和值都不可变
    const int* const p3 = &a;
    //p3 = &b;  // ❌ 错误:指针不可修改
    //*p3 = 30; // ❌ 错误:不能修改值

    return 0;
}

理解 const 位置,避免指针错误! 🚀

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值