【C++面试必看】const int *p 和 int * const p 有什么区别?一文彻底搞懂!

彻底搞懂const与指针的区别

很多C++初学者,甚至一些有经验的开发者,在const关键字与指针共舞时,常常会感到困惑。

const int *p、int * const p、const int * const p,这几个看起来像是“大家来找茬”的声明,实则蕴含着C++对类型安全和程序严谨性的深刻设计。今天,就让我们彻底终结这份困惑!

一、温故知新:const修饰普通变量

这个大家最熟悉,const修饰一个普通变量,意味着这个变量的值一旦初始化后,就不能再被修改。我们称之为“常量”。

const int a = 100;
// a = 200; // 错误!编译不通过,因为a是常量,其值不可修改

这很简单,是吧?接下来,难度升级!

二、核心进阶:const与指针的三种组合

这是本文的重点。为了方便理解,我们记住一个简单的规则:const靠近谁,谁就不能被修改

1. 常量指针 (const int p)

声明: const int *p; 或者 int const *p; (两者等价)

解读口诀: const 在 * 的左边,修饰的是*p,也就是指针指向的内容

这意味着:

  • 可以 修改指针的指向 (p可以指向其他地址)

  • 不可以 通过p来修改指针指向的内容

代码示例:

#include <iostream>

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

    const int *p = &a; // p是一个常量指针

    // 尝试修改指针指向的内容 -> 失败
    // *p = 15; // 错误!*p是const,不能被赋值

    std::cout << "通过p访问a的值: " << *p << std::endl;

    // 尝试修改指针的指向 -> 成功
    p = &b;
    std::cout << "p指向b后,通过p访问b的值: " << *p << std::endl;

    return 0;
}

总结: 常量指针,又叫“指向常量的指针”。它像是一个游客,可以随意看不同的景点(指向不同的地址),但不能在景点上乱涂乱画(不能修改指向的内容)。

2. 指针常量 (int * const p)

声明: int * const p;

解读口诀: const 在 * 的右边,修饰的是p本身,也就是指针的指向

这意味着:

  • 不可以 修改指针的指向 (p必须在定义时初始化,且之后不能再指向其他地址)

  • 可以 通过p来修改指针指向的内容

代码示例:

#include <iostream>

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

    int * const p = &a; // p是一个指针常量,必须在定义时初始化

    // 尝试修改指针的指向 -> 失败
    // p = &b; // 错误!p是const指针,其指向不能被修改

    std::cout << "p指向a的值: " << *p << std::endl;

    // 尝试修改指针指向的内容 -> 成功
    *p = 15;
    std::cout << "通过p修改后,a的值变为: " << a << std::endl;

    return 0;
}

总结: 指针常量,它自己的指向是“从一而终”的。它像是一把绑定到某个房子的钥匙,不能用来开别的房门(不能改变指向),但可以把这间房里的东西随便改(可以修改指向的内容)。

3. 指向常量的指针常量 (const int * const p)

声明: const int * const p;

解读口诀: * 的左右两边都有const,天罗地网,啥都不能改。

这意味着:

  • 不可以 修改指针的指向

  • 不可以 修改指针指向的内容

代码示例:

#include <iostream>

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

    const int * const p = &a; // 必须在定义时初始化

    // 尝试修改指针的指向 -> 失败
    // p = &b; // 错误!

    // 尝试修改指针指向的内容 -> 失败
    // *p = 15; // 错误!
    
    std::cout << "p指向a的值: " << *p << std::endl;

    return 0;
}

总结: 这是一个“双重锁定”的指针,指向和内容都被const锁死了,完全不能修改。

三、总结

声明类型指向可改?内容可改?
const int *p常量指针可以 ✅不行 ❌
int * const p指针常量不行 ❌可以 ✅
const int * const p指向常量的指针常量不行 ❌不行 ❌

记住那个简单的口诀:const靠近谁,谁就被锁定。希望通过这篇文章,你能够彻底征服const与指针这对“欢喜冤家”,在C++的世界里走得更远!🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值