【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,语法更简洁,但灵活性较低

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1198271.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源AI模型部署新选择:DeepSeek-R1-Distill-Qwen-1.5B实操手册

开源AI模型部署新选择&#xff1a;DeepSeek-R1-Distill-Qwen-1.5B实操手册 你是否在寻找一个轻量但推理能力出色的开源文本生成模型&#xff1f;既能处理数学题、写代码&#xff0c;又能进行逻辑分析&#xff0c;还不需要顶级显卡支持&#xff1f;今天要介绍的 DeepSeek-R1-Di…

快速掌握 eSpeak NG:面向新手的终极语音合成指南

快速掌握 eSpeak NG&#xff1a;面向新手的终极语音合成指南 【免费下载链接】espeak-ng espeak-ng: 是一个文本到语音的合成器&#xff0c;支持多种语言和口音&#xff0c;适用于Linux、Windows、Android等操作系统。 项目地址: https://gitcode.com/GitHub_Trending/es/esp…

证件照太糊怎么办?GPEN人像修复来救场

证件照太糊怎么办&#xff1f;GPEN人像修复来救场 你有没有遇到过这种情况&#xff1a;准备上传证件照时&#xff0c;系统提示“图片模糊&#xff0c;不符合要求”&#xff1f;明明是刚拍的照片&#xff0c;可放大一看&#xff0c;眼睛、眉毛、发丝全都糊成一片。别急&#xf…

Linux内核唤醒源终极指南:从故障诊断到性能优化深度剖析

Linux内核唤醒源终极指南&#xff1a;从故障诊断到性能优化深度剖析 【免费下载链接】linux Linux kernel source tree 项目地址: https://gitcode.com/GitHub_Trending/li/linux 你是否遇到过这样的情况&#xff1a;笔记本电脑合盖后仍然耗电严重&#xff0c;或者嵌入式…

Mage AI 终极快速入门指南:5分钟搭建你的第一个数据管道 [特殊字符]

Mage AI 终极快速入门指南&#xff1a;5分钟搭建你的第一个数据管道 &#x1f680; 【免费下载链接】mage-ai MAGE AI是一个专注于模型生命周期管理的平台&#xff0c;它有助于简化机器学习模型从训练到部署的过程&#xff0c;提供版本控制、协作、API服务化等功能&#xff0c;…

用Qwen-Image-Edit-2511做了个AI修图工具,附完整过程

用Qwen-Image-Edit-2511做了个AI修图工具&#xff0c;附完整过程 基于Qwen-Image-Edit-2511打造的AI图像编辑工具正在悄然改变内容创作的方式。这款由通义千问团队推出的增强版多模态模型&#xff0c;在图像一致性、几何推理和工业设计生成方面实现了显著提升。本文将带你从零开…

基于MATLAB的可见光通信系统仿真实现

一、系统架构设计 本仿真系统包含以下核心模块&#xff1a; 信号生成与调制&#xff1a;支持QPSK/16QAM/PPM调制光信道建模&#xff1a;Lambertian模型多径效应光电转换与噪声添加&#xff1a;LED驱动模型AWGN噪声同步与解调&#xff1a;滑动相关同步能量检测性能评估&#x…

“每单多收3欧元”的时代来了:跨境卖家如何把低价小包从“风险”改造成“可控利润”

很多跨境团队这两年吃到的红利&#xff0c;本质来自一件事&#xff1a;低价值小包的成本结构不透明——关税、清关、平台履约约束都相对“松”。但从 2025 年底到 2026 年初&#xff0c;欧盟与平台规则给出了非常清晰的信号&#xff1a;低价小包要被系统性“重新定价”。这篇文…

Qwen_Image_Cute_Animal_For_Kids如何调优?GPU算力适配实战

Qwen_Image_Cute_Animal_For_Kids如何调优&#xff1f;GPU算力适配实战 1. 项目背景与核心价值 你有没有试过给孩子讲一个关于小动物的故事&#xff0c;却苦于找不到合适的插图&#xff1f;现在&#xff0c;有了 Cute_Animal_For_Kids_Qwen_Image&#xff0c;这个问题迎刃而解…

Lance存储架构:解决大规模结构化数据管理的新范式

Lance存储架构&#xff1a;解决大规模结构化数据管理的新范式 【免费下载链接】lance lancedb/lance: 一个基于 Go 的分布式数据库管理系统&#xff0c;用于管理大量结构化数据。适合用于需要存储和管理大量结构化数据的项目&#xff0c;可以实现高性能、高可用性的数据库服务。…

OpenVR高级设置:终极VR设置工具,解锁SteamVR性能优化新境界

OpenVR高级设置&#xff1a;终极VR设置工具&#xff0c;解锁SteamVR性能优化新境界 【免费下载链接】OpenVR-AdvancedSettings OpenVR Advanced Settings Dashboard Overlay 项目地址: https://gitcode.com/gh_mirrors/op/OpenVR-AdvancedSettings OpenVR-AdvancedSetti…

异步编程终极指南:解锁非阻塞架构的实战密码

异步编程终极指南&#xff1a;解锁非阻塞架构的实战密码 【免费下载链接】spring-framework 项目地址: https://gitcode.com/gh_mirrors/spr/spring-framework 你是否曾为传统应用的线程阻塞而苦恼&#xff1f;当高并发请求如潮水般涌来时&#xff0c;线程池的耗尽是否…

Keyframes动画库完整使用指南:从零基础到精通实战

Keyframes动画库完整使用指南&#xff1a;从零基础到精通实战 【免费下载链接】Keyframes A library for converting Adobe AE shape based animations to a data format and playing it back on Android and iOS devices. 项目地址: https://gitcode.com/gh_mirrors/ke/Keyf…

Android横向刷新终极指南:SmartRefreshHorizontal完整教程

Android横向刷新终极指南&#xff1a;SmartRefreshHorizontal完整教程 【免费下载链接】SmartRefreshHorizontal 横向刷新、水平刷新、RefreshLayout、OverScroll&#xff0c;Horizontal&#xff0c;基于SmartRefreshLayout的水平智能刷新 项目地址: https://gitcode.com/gh…

原神祈愿记录导出工具终极指南:3步轻松掌握数据管理

原神祈愿记录导出工具终极指南&#xff1a;3步轻松掌握数据管理 【免费下载链接】genshin-wish-export biuuu/genshin-wish-export - 一个使用Electron制作的原神祈愿记录导出工具&#xff0c;它可以通过读取游戏日志或代理模式获取访问游戏祈愿记录API所需的authKey。 项目地…

小白也能懂:用Cute_Animal_For_Kids_Qwen_Image实现儿童插画自由

小白也能懂&#xff1a;用Cute_Animal_For_Kids_Qwen_Image实现儿童插画自由 你是不是也经常为找不到合适的儿童插画发愁&#xff1f;绘本、课件、手工材料、生日贺卡……每次都要花大量时间找图&#xff0c;还担心版权问题。现在&#xff0c;有了 Cute_Animal_For_Kids_Qwen_…

告别背景噪音:用RNNoise语音降噪技术打造纯净通话体验

告别背景噪音&#xff1a;用RNNoise语音降噪技术打造纯净通话体验 【免费下载链接】noise-suppression-for-voice Noise suppression plugin based on Xiphs RNNoise 项目地址: https://gitcode.com/gh_mirrors/no/noise-suppression-for-voice 还在为视频会议中的键盘声…

打造无广告隐私视频体验:Invidious扩展生态完全指南

打造无广告隐私视频体验&#xff1a;Invidious扩展生态完全指南 【免费下载链接】invidious Invidious is an alternative front-end to YouTube 项目地址: https://gitcode.com/GitHub_Trending/in/invidious 在当今数字时代&#xff0c;视频观看已成为日常生活的重要组…

支持18种声音风格的语音合成工具|Voice Sculptor使用全攻略

支持18种声音风格的语音合成工具&#xff5c;Voice Sculptor使用全攻略 1. 快速上手&#xff1a;三步生成专属语音 你有没有遇到过这样的情况&#xff1a;想给视频配个专业旁白&#xff0c;却找不到合适的人声&#xff1b;想做儿童故事音频&#xff0c;又担心声音不够温柔&am…

HOScrcpy终极指南:鸿蒙远程投屏的完整解决方案

HOScrcpy终极指南&#xff1a;鸿蒙远程投屏的完整解决方案 【免费下载链接】鸿蒙远程真机工具 该工具主要提供鸿蒙系统下基于视频流的投屏功能&#xff0c;帧率基本持平真机帧率&#xff0c;达到远程真机的效果。 项目地址: https://gitcode.com/OpenHarmonyToolkitsPlaza/HO…