常量指针、指针常量和指向常量的常指针的区别

常量指针、指针常量和指向常量的常指针的区别

1. 指针的基本概念

指针是一个变量,用于存储另一个变量在内存中的地址。通过指针,可以直接访问或修改该内存地址上的数据。

int a = 10;
int *p;
p = &a; // 将变量 a 的地址赋值给指针 p
  • 内存地址:内存被视为一个线性的字节数组,每个字节都有唯一的地址,称为内存地址。
  • 指针大小
    • 32 位系统:在32位系统中,处理器一次能处理的最大位数是2的32次方 ,也就是一次处理4个字节的内存数据,那么指针的长度也就是4个字节
    • 64 位系统:处理器一次能处理的最大位数是2的64次方 ,也就是一次处理8个字节的内存数据,那么指针的长度也就是8个字节。

2. const 关键字

  • 定义const 是用于限定变量不可修改的关键字。
  • 作用:被 const 修饰的变量,其值在初始化后不能被改变。
const int a = 7;
// a = 8; // 错误,不能修改 const 变量的值

3. 指针常量、常量指针和指向常量的常指针

3.1 指针常量(Pointer Constant)

  • 特点

    • 指针的指向 不可变
    • 可以修改指针所指向的值。
  • 声明方式

    int *const p = &a;
    
  • 示例

    int a = 10;
    int *const p = &a;
    *p = 20; // 合法,修改指针指向的值
    // p = &b; // 非法,不能改变指针的指向
    

3.2 常量指针(Pointer to Constant)

  • 特点

    • 指针的指向 可变
    • 不能修改指针所指向的值。
  • 声明方式

    const int *p = &a;
    // 或
    int const *p = &a;
    
  • 示例

    int a = 10;
    int b = 20;
    const int *p = &a;
    // *p = 30; // 非法,不能修改指针所指向的值
    p = &b;    // 合法,可以改变指针的指向
    

3.3 指向常量的常指针(Constant Pointer to Constant)

  • 特点

    • 指针的指向 不可变
    • 不能修改指针所指向的值。
  • 声明方式

    const int *const p = &a;
    
  • 示例

    int a = 10;
    const int *const p = &a;
    // *p = 20; // 非法,不能修改指针所指向的值
    // p = &b;  // 非法,不能改变指针的指向
    

4. 区分方法

4.1 按照命名顺序

  • 指针常量int *const p,先有指针 int *,后有 const 修饰指针 p,表示指针是常量。
  • 常量指针const int *pint const *pconst 修饰指向的数据,表示数据是常量。

4.2 根据 const 位置

  • const 紧挨着类型名(在 * 左侧):常量指针,不能修改所指向的数据。
  • const 紧挨着指针名(在 * 右侧):指针常量,不能修改指针的指向。
  • 两侧都有 const:指向常量的常指针,指针和指向的数据都不可修改。

4.3 从右向左阅读

  • int const *p*pconst int,不能修改指向的数据,指针 p 可变。
  • int *const ppconst,指针不可变,但可以修改指向的数据 *p

5. 实际应用

  • 常量指针用于函数参数:防止函数内部修改传入的数据。

    size_t strlen(const char *str); // 常量指针,保证函数内部不修改 str 的内容
    
  • 示例

    char str[] = "hello";
    size_t len = strlen(str);
    // strlen 函数内部不能修改 str 的内容
    

6. 注意事项

6.1 空指针(Null Pointer)

  • 定义:指向内存地址为 NULL 的指针。

  • 特点:不能对空指针进行解引用操作。

    int *p = NULL;
    // *p = 10; // 错误,不能解引用空指针
    

6.2 野指针(Dangling Pointer)

  • 定义:指向未分配或已释放内存的指针。

  • 特点:使用野指针会导致程序崩溃或不可预知的行为。

    int *p;        // 未初始化,指向未知地址
    int *p = (int *)0x1100; // 随意赋值,可能非法
    int *p = new int(5);
    delete p;      // 释放内存
    p = NULL;      // 避免成为野指针
    

7. 总结

常量指针指针常量指向常量的常指针本质上都是指针,只是由于 const 关键字所约束的范围不同,导致它们在修改指针本身或指针所指向的数据时受到不同的限制。

  • 常量指针(const int *pconst 修饰的是指针所指向的数据,因此不能通过指针修改数据,但可以改变指针的指向。
  • 指针常量(int *const pconst 修饰的是指针本身,指针的指向不可改变,但可以修改指针所指向的数据。
  • 指向常量的常指针(const int *const pconst 同时修饰指针和指向的数据,既不能改变指针的指向,也不能修改指针所指向的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开朗碳基生物

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值