【C/C++ 重难点精讲】const 与指针、引用:彻底理清权限与用法

一、前言

在 C/C++ 学习中,const、指针、引用 永远是绕不开的三座大山。

  • const int*int* const 到底谁不能改

  • 引用和指针本质区别是什么

  • 为什么 const int& a = 10; 可以编译通过

  • 函数传参什么时候用 const,什么时候用指针 / 引用

本文从基础到实战,用清晰逻辑 + 典型代码,一次性把这些问题讲透。


二、 const 关键字基本概念

constconstant 的缩写,表示只读、不可修改

被 const 修饰的变量,在初始化之后不能被赋值修改。

cpp 复制代码
const int a = 100;
a = 200;    // 编译错误:a 是只读变量

作用:

  1. 保护数据,防止意外修改

  2. 提高代码可读性和安全性

  3. 便于编译器优化

  4. 函数传参时明确 "不修改参数" 的语义


三、const 与指针(重点难点)

const 和指针结合时,const 的位置决定了它修饰谁

判断规则:看 const 是在 * 左边还是右边

1 指向常量的指针:const int* /int const*

cpp 复制代码
const int* p;
// 等价于
int const* p;

含义:

  • *指针指向的内容是常量,不能通过 p 修改

  • 指针本身可以修改,可以指向其他变量

示例:

cpp 复制代码
int a = 10;
int b = 20;
const int* p = &a;

*p = 100;   // 错误:不能修改指向的值
p = &b;     // 正确:指针可以重新指向

适用场景:函数只想读取数据,不希望被修改。

2 指针常量:int* const

cpp 复制代码
int* const p;

含义:

  • 指针本身是常量,不能改变指向

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

示例:

cpp 复制代码
int a = 10;
int b = 20;
int* const p = &a;

*p = 100;   // 正确:可以修改值
p = &b;     // 错误:指针不能重新指向

3 指向常量的指针常量:const int* const

cpp 复制代码
const int* const p;

含义:

  • 指针不能改指向

  • 指向的值也不能改

最严格的只读形式。

4 总结与判断口诀

写法 指针能否改指向 指向的值能否改 记忆口诀
const int* p 左定值
int const* p 左定值
int* const p 右定向
const int* const p 都不能

口诀:const 在 * 左边,定的是值; const 在 * 右边,定的是指针。


四、const 与引用

1 引用的基本特性

引用 & 是变量的别名,必须初始化,且一旦绑定无法更换。

cpp 复制代码
int a = 10;
int& ra = a;

ra = 20;     // 等价于 a = 20

特点:

  • 不能为空

  • 必须初始化

  • 不能重新绑定到其他变量

  • 用法和原变量一样,不需要解引用

2 const 引用(常引用)

cpp 复制代码
const int& ra = a;

表示:

  • 通过 ra 不能修改 a 的值

  • 原变量 a 本身可以改

cpp 复制代码
int a = 10;
const int& ra = a;

ra = 100;    // 错误
a = 100;     // 正确

3 const 引用绑定临时对象

普通引用不能绑定字面量、临时对象,但 const 引用可以。

cpp 复制代码
// int& ra = 10;     // 错误
const int& ra = 10;   // 正确

编译器会在内存中创建一个临时变量存储 10,再让 ra 绑定它。这也是函数参数推荐使用 const T& 的重要原因。


五、 指针与引用的区别

对比项 指针 (pointer) 引用 (reference)
本质 存放地址的变量 变量别名
能否为空 可以 不可以
能否重新指向 可以 不可以
是否需要初始化 不必 必须
多级使用 支持二级指针 无二级引用
操作方式 需要 * 解引用 直接使用
空指针检查 必须判断 无需判断

一句话总结:引用是更安全、受限更少的指针;指针是更灵活、更危险的引用。


六、 const 在函数参数中的实战用法

实际开发中,const 配合指针 / 引用,主要用于函数传参

1. 不想修改数据,用 const

cpp 复制代码
void show(const int* p) {
    // *p = 999;  // 报错,安全
}

void show(const int& a) {
    // a = 999;   // 报错,安全
}

2.对象较大时,用 const& 避免拷贝

cpp 复制代码
// 高效、安全、标准写法
void printInfo(const Student& stu) {
    // ...
}

比值传递快,比指针更安全。


七、试题总结

1.const int* pint* const p 的区别?

前者值不能改,后者指针不能改。

2.引用可以为空吗?

不可以,必须初始化。

3.指针和引用的本质区别?

指针是实体变量,引用是别名。

4.为什么 const int& a = 10 合法?

const 引用允许绑定临时对象。

5.函数参数优先用什么?

内置类型用值传递;复杂类型优先 const &

6.非 const 指针可以指向 const 变量吗?

不可以,会丢失 const 属性,编译报错。


八、总结

  1. const 离谁近,就修饰谁,谁就不能改

  2. 引用 = 别名,不能为空,不能重新绑定

  3. 指针 = 地址,可以空,可以改

  4. 函数传参优先用 const &,安全高效

相关推荐
百万老师1 天前
自然语言编程时代,如何零基础学习掌握嵌入式编程
c语言·单片机·嵌入式硬件·学习·ai全流程闭环开发
lingzhilab1 天前
零知派ESP32——BLE Mesh蓝牙组网智能灯控系统(PIR感应+W2812三档调色)
c++·mfc
计算机安禾1 天前
【c++面向对象编程】第29篇:定位new(placement new):在指定内存上构造对象
开发语言·c++·算法
淞綰1 天前
c语言的练习-字符串的练习-寻找最长连续字符以及出现次数
c语言·数据结构·学习·算法·c语言的练习
计算机安禾1 天前
【c++面向对象编程】第27篇:空类的大小为什么是1?——C++对象标识的秘密
开发语言·c++·算法
rGzywSmDg1 天前
如何在Dev-C++中选择TDM-GCC编译器
linux·jvm·c++
云泽8081 天前
笔试算法 - 滑动窗口篇(二):从异位词到最小覆盖子串的通用框架
c++·算法
_wxd6661 天前
类与对象 (上) (C++)
c++
basketball6161 天前
并查集基础算法总结 C++ 实现
开发语言·c++·算法