const int *和int * const傻傻分不清?你只需要看这一篇文章

const int *int * const 的区别

在C/C++中,const关键字用于定义常量。const的位置决定了它是修饰指针本身还是指针所指向的值。具体来说:

  • const int *: 指向常量整数的指针,不允许通过指针修改所指向的值。
  • int * const: 常量指针,指针本身是常量,不允许重新指向其他地址,但可以通过指针修改所指向地址的值。

详细说明
  1. const int *:

    • 含义: const修饰的是int,表示指针所指向的整数是常量。
    • 特点:
      • 不能通过该指针修改所指向的整数值。
      • 可以改变指针本身指向的地址。
      • 适用于保护数据不被意外修改的场景。
    • 示例:
      const int *ptr;
      int a = 10, b = 20;
      ptr = &a;  // 合法,ptr指向a
      std::cout << *ptr << std::endl;  // 输出: 10
      ptr = &b;  // 合法,ptr指向b
      std::cout << *ptr << std::endl;  // 输出: 20
      // *ptr = 30;  // 非法,不能通过ptr修改b的值
      
  2. int * const:

    • 含义: const修饰的是指针本身,表示指针是常量。
    • 特点:
      • 不能改变指针本身指向的地址。
      • 可以通过该指针修改所指向的整数值。
      • 适用于需要固定指针指向的场景。
    • 示例:
      int a = 10, b = 20;
      int * const ptr = &a;  // 合法,ptr指向a
      std::cout << *ptr << std::endl;  // 输出: 10
      *ptr = 30;  // 合法,可以通过ptr修改a的值
      std::cout << a << std::endl;  // 输出: 30
      // ptr = &b;  // 非法,不能改变ptr的指向
      
  3. const int * const:

    • 含义: const同时修饰指针和指针所指向的值。
    • 特点:
      • 不能改变指针本身指向的地址。
      • 不能通过指针修改所指向的值。
      • 适用于需要完全保护数据和指针指向的场景。
    • 示例:
      int a = 10, b = 20;
      const int * const ptr = &a;  // 合法,ptr指向a
      std::cout << *ptr << std::endl;  // 输出: 10
      // ptr = &b;  // 非法,不能改变ptr的指向
      // *ptr = 30;  // 非法,不能通过ptr修改a的值
      

总结
特性const int *int * constconst int * const
指针指向的地址可以改变不能改变不能改变
指针指向的值不能修改可以修改不能修改
适用场景保护数据不被修改固定指针指向,允许修改数据完全保护数据和指针指向

示例代码
#include <iostream>

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

    // const int * 示例
    const int *ptr1 = &a;
    std::cout << "ptr1 points to: " << *ptr1 << std::endl;  // 输出: 10
    ptr1 = &b;  // 合法,ptr1指向b
    std::cout << "ptr1 now points to: " << *ptr1 << std::endl;  // 输出: 20
    // *ptr1 = 30;  // 非法,不能通过ptr1修改b的值

    // int * const 示例
    int * const ptr2 = &a;
    std::cout << "ptr2 points to: " << *ptr2 << std::endl;  // 输出: 10
    *ptr2 = 30;  // 合法,可以通过ptr2修改a的值
    std::cout << "a is now: " << a << std::endl;  // 输出: 30
    // ptr2 = &b;  // 非法,不能改变ptr2的指向

    // const int * const 示例
    const int * const ptr3 = &a;
    std::cout << "ptr3 points to: " << *ptr3 << std::endl;  // 输出: 30
    // ptr3 = &b;  // 非法,不能改变ptr3的指向
    // *ptr3 = 40;  // 非法,不能通过ptr3修改a的值

    return 0;
}
ptr1 points to: 10
ptr1 now points to: 20
ptr2 points to: 10
a is now: 30
ptr3 points to: 30

进一步理解

const int * 的应用场景

当函数参数需要传递一个只读的指针时,使用 const int * 可以防止函数内部意外修改数据。

示例:

void printValue(const int *ptr) {
    std::cout << *ptr << std::endl;
    // *ptr = 10;  // 非法,不能修改数据
}
int * const 的应用场景

当需要固定指针指向某个地址,但允许修改该地址的值时,使用 int * const

示例:

void modifyValue(int * const ptr) {
    *ptr = 100;  // 合法,可以修改数据
    // ptr = nullptr;  // 非法,不能改变指针指向
}
const int * const 的应用场景

当需要完全保护指针指向的地址和数据时,使用 const int * const

void printAndProtect(const int * const ptr) {
    std::cout << *ptr << std::endl;
    // ptr = nullptr;  // 非法,不能改变指针指向
    // *ptr = 100;  // 非法,不能修改数据
}
const int * 和 int * const 的区别
const int *
int * const
指向常量整数的指针
不能通过指针修改值
可以改变指针指向的地址
常量指针
不能改变指针指向的地址
可以通过指针修改值

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Cider瞳

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

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

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

打赏作者

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

抵扣说明:

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

余额充值