跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++ 指针与引用的深入解析与对比

详细阐述了 C++ 中指针与引用的基本概念及核心区别。指针作为存储地址的变量,支持空值和重新指向;引用则是变量的别名,必须初始化且不可变。文章对比了二者在声明、内存占用、操作符等方面的差异,并结合代码示例说明了各自的适用场景,如函数参数传递、动态内存管理等。

樱花落尽发布于 2026/3/29更新于 2026/9/1276 浏览
一。指针和引用的概念

**指针:**指针是一个变量,其值为另一个变量的内存地址。我们可以通过指针来间接访问和修改它所指向的变量的值。

int main() { int x = 10; int* ptr = &x; // 指针 ptr 指向 x 的地址 cout << "x 的值:" << x << endl; // 直接访问 x cout << "x 的地址:" << &x << endl; // 输出 x 的地址 cout << "ptr 的值:" << ptr << endl; // 输出 ptr 存储的地址(即 x 的地址) cout << "ptr 指向的值:" << *ptr << endl; // 通过指针访问 x 的值 *ptr = 20; // 通过指针修改 x 的值 cout << "修改后 x 的值:" << x << endl; return 0; }

**引用:**引用是已存在变量的别名,它与被引用的变量共享同一内存地址。引用一旦初始化后,就不能再指向其他变量。

int main() { int x = 10; int& ref = x; // ref 是 x 的引用(别名) cout << "x 的值:" << x << endl; cout << "ref 的值:" << ref << endl; cout << "x 的地址:" << &x << endl; cout << "ref 的地址:" << &ref << endl; // 与 x 的地址相同 ref = 20; // 通过引用修改 x 的值 cout << "修改后 x 的值:" << x << endl; return 0; }

二。指针与引用的核心区别
1. 声明与初始化
  • 指针:使用*声明,可以不初始化(但不推荐),也可以初始化为nullptr
int* ptr1; // 未初始化的指针(危险) int* ptr2 = nullptr; // 空指针 int x = 5; int* ptr3 = &x; // 指向 x 的指针
  • 引用:使用&声明,必须在创建时初始化,且不能初始化为**nullptr**
int x = 5; int& ref1 = x; // 正确,ref1 是 x 的引用 // int& ref2; // 错误,引用必须初始化 // int& ref3 = nullptr; // 错误,不能将引用初始化为空
2. 可修改性
  • 指针:可以改变指向的对象
int x = 5, y = 10; int* ptr = &x; ptr = &y; // 指针现在指向 y
  • 引用:一旦绑定到某个对象,就不能再绑定到其他对象
int x = 5, y = 10; int& ref = x; ref = y; // 这是将 y 的值赋给 x,而不是让 ref 引用 y
3. 空值
  • 指针:可以为空(nullptr),表示不指向任何对象
int* ptr = nullptr; // 空指针
  • 引用:不能为空,必须始终引用一个有效的对象。不存在 "空引用" 的概念
4. 内存占用
  • 指针:需要占用内存空间来存储地址(通常为 4 字节或 8 字节,取决于系统)
  • 引用:在语法层面不占用内存空间,它只是一个别名。编译器通常会使用指针来实现引用,但这是编译器内部的事情,对程序员是透明的。
5. 操作符
  • 指针:使用*运算符访问指向的对象,使用->运算符访问指向对象的成员
struct Person { string name; int age; }; Person p{"Alice", 30}; Person* ptr = &p; cout << ptr->name << endl; // 使用->访问成员 cout << (*ptr).age << endl; // 先解引用再用。访问成员
  • 引用:直接使用.运算符访问成员,无需解引用
Person p{"Bob", 25}; Person& ref = p; cout << ref.name << endl; // 直接使用。访问成员
6. 多级访问

指针:支持多级指针(指针的指针)

int x = 5; int* ptr = &x; int**ptr_ptr = &ptr; // 指向指针的指针 cout << ** ptr_ptr << endl; // 输出 5

引用:不支持多级引用,不存在 "引用的引用"


三。指针与引用的共同点
  1. 都可以间接访问和修改所指向 / 引用的变量
  2. 都可以作为函数参数,实现参数的 "传址" 效果,允许函数修改实参的值
  3. 都可以指向 / 引用堆上分配的内存
何时使用指针,何时使用引用?
使用引用的场景:
  1. 函数参数传递,尤其是对于大型对象,可以避免拷贝开销,同时不希望参数为 null
  2. 函数返回值,当函数需要返回容器元素或对象成员的访问权时
  3. 操作符重载(如**operator=**),使语法更自然
// 引用作为函数参数 void swap(int& a, int& b) { int temp = a; a = b; b = temp; }
// 引用作为函数返回值 vector<int> vec = {1, 2, 3}; int& get_element(int index) { return vec[index]; // 返回向量元素的引用 }
使用指针的场景:
  1. 需要表示 "空" 的情况(可以使用**nullptr**)
  2. 需要改变指向的目标时
  3. 处理动态分配的内存
  4. 实现数据结构(如链表、树等)
  5. 函数需要返回多个值时(通过指针参数)
// 指针表示空值 int* find(int* arr, int size, int target) { for (int i = 0; i < size; i++) { if (arr[i] == target) { return &arr[i]; } } return nullptr; // 未找到,返回空指针 }
// 动态内存分配 int* create_array(int size) { return new int[size]; // 返回指向新分配数组的指针 }

指针和引用都是 C++ 中用于间接访问变量的重要工具,它们各有特点和适用场景:

  • 指针更灵活,可以为空,可以改变指向,但使用不当容易引发错误
  • 引用更安全,必须初始化且不能为 null,语法更简洁,但灵活性较低

目录

  1. 一。指针和引用的概念
  2. 二。指针与引用的核心区别
  3. 1. 声明与初始化
  4. 2. 可修改性
  5. 3. 空值
  6. 4. 内存占用
  7. 5. 操作符
  8. 6. 多级访问
  9. 三。指针与引用的共同点
  10. 何时使用指针,何时使用引用?
  11. 使用引用的场景:
  12. 使用指针的场景:

更多推荐文章

查看全部
  • C++ 递归经典实战:汉诺塔问题解析
  • Spring Boot Web 三大核心交互实战:表单、AJAX 与 JSON
  • 6款免费AI写作软件测评:AI写网文工具对比与去重技巧
  • Mac 开发环境详解:Xcode 作用与安装
  • HTML5 结合 AI 实现智能场景渲染与交互
  • 基于 Rokid 眼镜的 AI 天气与旅游规划实现
  • VS2019 C++ 调用 YOLOv3 动态库实现目标检测
  • CogVideoX v1.5 开源发布:支持 5/10 秒视频生成与图生视频增强
  • 数学建模竞赛全流程指南与 AI 提示词
  • URDF 入门指南:创建你的第一个机器人模型
  • GitHub Agent HQ 全流程实战:Copilot Pro 接入与代码库生命周期管理
  • 大模型时代:新手与程序员转型 AI 行业的最佳路径
  • C++ 继承机制详解:从概念定义到默认成员函数
  • FPGA 商用级 ISP:动态坏点校正(DPCC)的滑窗架构与并行判决实现
  • Java 设计支持万人并发抢购的秒杀系统方案
  • 8 个实用 jQuery 技巧
  • OpenClaw + Ollama 本地部署指南
  • SpringBoot 整合 Flowable 实现工作流实战指南
  • 英伟达 GTC 2025 医疗健康与生命科学会议要点解析
  • Vue 3 编程的 10 个实用技巧

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online