news 2026/6/23 23:46:05

【C++】--指针与引用深入解析和对比

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【C++】--指针与引用深入解析和对比

一.指针和引用的概念

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

代码语言:javascript

AI代码解释

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; }

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

代码语言:javascript

AI代码解释

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

代码语言:javascript

AI代码解释

int* ptr1; // 未初始化的指针(危险) int* ptr2 = nullptr; // 空指针 int x = 5; int* ptr3 = &x; // 指向x的指针
  • 引用:使用&声明,必须在创建时初始化,且不能初始化为nullptr

代码语言:javascript

AI代码解释

int x = 5; int& ref1 = x; // 正确,ref1是x的引用 // int& ref2; // 错误,引用必须初始化 // int& ref3 = nullptr; // 错误,不能将引用初始化为空
2. 可修改性
  • 指针:可以改变指向的对象

代码语言:javascript

AI代码解释

int x = 5, y = 10; int* ptr = &x; ptr = &y; // 指针现在指向y
  • 引用:一旦绑定到某个对象,就不能再绑定到其他对象

代码语言:javascript

AI代码解释

int x = 5, y = 10; int& ref = x; ref = y; // 这是将y的值赋给x,而不是让ref引用y
3. 空值
  • 指针:可以为空(nullptr),表示不指向任何对象

代码语言:javascript

AI代码解释

int* ptr = nullptr; // 空指针
  • 引用:不能为空,必须始终引用一个有效的对象。不存在 "空引用" 的概念
4. 内存占用
  • 指针:需要占用内存空间来存储地址(通常为 4 字节或 8 字节,取决于系统)
  • 引用:在语法层面不占用内存空间,它只是一个别名。编译器通常会使用指针来实现引用,但这是编译器内部的事情,对程序员是透明的。
5. 操作符
  • 指针:使用*运算符访问指向的对象,使用->运算符访问指向对象的成员

代码语言:javascript

AI代码解释

struct Person { string name; int age; }; Person p{"Alice", 30}; Person* ptr = &p; cout << ptr->name << endl; // 使用->访问成员 cout << (*ptr).age << endl; // 先解引用再用.访问成员
  • 引用:直接使用.运算符访问成员,无需解引用

代码语言:javascript

AI代码解释

Person p{"Bob", 25}; Person& ref = p; cout << ref.name << endl; // 直接使用.访问成员
6. 多级访问

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

代码语言:javascript

AI代码解释

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

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


三.指针与引用的共同点

  1. 都可以间接访问和修改所指向 / 引用的变量
  2. 都可以作为函数参数,实现参数的 "传址" 效果,允许函数修改实参的值
  3. 都可以指向 / 引用堆上分配的内存
何时使用指针,何时使用引用?
使用引用的场景:
  1. 函数参数传递,尤其是对于大型对象,可以避免拷贝开销,同时不希望参数为 null
  2. 函数返回值,当函数需要返回元素或对象成员的访问权时
  3. 操作符重载(如operator=),使语法更自然

代码语言:javascript

AI代码解释

// 引用作为函数参数 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. 函数需要返回多个值时(通过指针参数)

代码语言:javascript

AI代码解释

// 指针表示空值 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,语法更简洁,但灵活性较低
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/22 19:38:37

终极指南:5分钟掌握openpi机械臂AI控制系统

终极指南&#xff1a;5分钟掌握openpi机械臂AI控制系统 【免费下载链接】openpi 项目地址: https://gitcode.com/GitHub_Trending/op/openpi 还在为机械臂编程的复杂性而苦恼&#xff1f;openpi机械臂AI控制系统将彻底改变你的开发体验。这套开源系统通过智能化的AI推理…

作者头像 李华
网站建设 2026/6/22 19:33:53

深度解析Linux内核PCIe热插拔:5大核心技术实现原理

深度解析Linux内核PCIe热插拔&#xff1a;5大核心技术实现原理 【免费下载链接】linux Linux kernel source tree 项目地址: https://gitcode.com/GitHub_Trending/li/linux 在现代数据中心和服务器环境中&#xff0c;PCIe热插拔技术已成为确保业务连续性和硬件灵活性的…

作者头像 李华
网站建设 2026/6/19 19:06:54

开发者必看:Sambert语音合成API调用方法与部署避坑指南

开发者必看&#xff1a;Sambert语音合成API调用方法与部署避坑指南 1. Sambert多情感中文语音合成&#xff0c;开箱即用的高质量TTS方案 你有没有遇到过这样的场景&#xff1a;项目需要生成一段带情绪的中文语音&#xff0c;比如客服播报要温柔&#xff0c;广告配音要激昂&am…

作者头像 李华
网站建设 2026/6/14 23:35:12

Qwen2.5-0.5B与StarCoder2-3B对比:代码生成效率评测

Qwen2.5-0.5B与StarCoder2-3B对比&#xff1a;代码生成效率评测 1. 引言&#xff1a;小模型也能高效写代码&#xff1f; 你有没有遇到过这样的场景&#xff1a;只是想快速写个脚本处理数据&#xff0c;或者临时调试一段函数&#xff0c;却要打开笨重的IDE、配置复杂的环境&am…

作者头像 李华
网站建设 2026/6/12 11:39:04

25美元打造AI智能眼镜:OpenGlass终极指南

25美元打造AI智能眼镜&#xff1a;OpenGlass终极指南 【免费下载链接】OpenGlass Turn any glasses into AI-powered smart glasses 项目地址: https://gitcode.com/GitHub_Trending/op/OpenGlass 想要拥有一副AI智能眼镜却担心高昂的价格&#xff1f;OpenGlass项目让你…

作者头像 李华
网站建设 2026/6/21 6:51:34

Qwen All-in-One开发者指南:PyTorch原生集成教程

Qwen All-in-One开发者指南&#xff1a;PyTorch原生集成教程 1. 背景与目标&#xff1a;用一个模型解决两类任务 你有没有遇到过这样的场景&#xff1f;项目需要同时做情感分析和智能对话&#xff0c;于是你下载了BERT做分类、又搭了个LLM做聊天。结果显存爆了&#xff0c;依…

作者头像 李华