C++ 引用和指针:内存地址、创建方法及应用解析

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 'markdown'C++ 中的引用是现有变量的别名,用 `&` 创建。例如:`string &meal = food;`。指针通过 `&` 获取变量内存地址,用 `*` 创建。指针变量存储地址,如 `string *ptr = &food;`。引用不可为空且不可变,指针可为空且可变,适用于动态内存和复杂数据结构。两者在函数参数传递和效率提升方面各有优势。```

C++ 引用和指针

创建引用

引用变量是对现有变量的“别名”,它是使用 & 运算符创建的:

string food = "Pizza"; // 食物变量
string &meal = food;   // 对 food 的引用

现在,我们可以使用变量名 food 或引用名 meal 来引用食物变量:

cout << food << "\n"; // 输出 Pizza
cout << meal << "\n"; // 输出 Pizza

C++ 内存地址

内存地址

在前一页的示例中,使用 & 运算符创建了一个引用变量。但它也可以用于获取变量的内存地址;即变量在计算机上存储的位置。

当在 C++ 中创建一个变量时,会为该变量分配一个内存地址。当我们给变量赋值时,它将存储在这个内存地址中。

要访问它,使用 & 运算符,结果将表示变量存储的位置:

string food = "Pizza";
cout << &food; // 输出 0x6dfed4

注意:内存地址以十六进制形式表示(0x..)。注意你可能在你的程序中得不到相同的结果。

为什么知道内存地址很有用呢?

引用和指针在 C++ 中非常重要,因为它们使你能够操作计算机内存中的数据 - 这可以减少代码并提高性能。

这两个特性是使 C++ 与其他编程语言(如 Python 和 Java)不同的因素之一。

C++ 指针

创建指针

可以使用 & 运算符获取变量的内存地址:

string food = "Pizza"; // 类型为 string 的食物变量
cout << food;  // 输出 food 的值(Pizza)
cout << &food; // 输出 food 的内存地址(0x6dfed4)

然而,指针是一种将内存地址作为其值的变量。

指针变量指向相同类型的数据类型(如 intstring),并使用 * 运算符创建。将正在处理的变量的地址分配给指针:

string food = "Pizza"; // 类型为 string 的食物变量
string* ptr = &food;   // 指针变量,名为 ptr,存储 food 的地址
// 输出 food 的值(Pizza)
cout << food << "\n";
// 输出 food 的内存地址(0x6dfed4)
cout << &food << "\n";
// 使用指针输出 food 的内存地址(0x6dfed4)
cout << ptr << "\n";

示例解释

  • 使用星号 *string* ptr)创建一个名为 ptr 的指针变量,它指向一个字符串变量。注意指针的类型必须与你正在处理的变量的类型匹配。
  • 使用 & 运算符存储名为 food 的变量的内存地址,并将其分配给指针。
  • 现在,ptr 持有 food 的内存地址的值。

提示:声明指针变量有三种方式,但第一种方式是首选的:

string* mystring; // 首选
string *mystring;
string * mystring;

引用和指针的区别

特性 引用 指针
初始化 必须初始化 可以不初始化
可空 不允许空引用 允许空指针
可变性 一旦初始化就不能改变引用指向的变量 可以改变指针指向的变量
解引用 不需要解引用 需要解引用
效率 通常比指针更有效率 通常比引用效率低

什么时候使用引用和指针

  • 使用引用:
  • 函数参数传递:引用可以传递给函数,函数可以直接修改引用指向的变量,而无需创建副本。
  • 提高效率:引用比指针更有效率,因为不需要指针的解引用操作。
  • 使用指针:
  • 动态内存分配:指针用于动态分配和释放内存。
  • 复杂数据结构:指针用于访问和操作复杂数据结构,例如链表和树。

总而言之,引用和指针都是 C++ 中强大的工具,可以用于高效地操作内存和数据。选择使用引用还是指针取决于具体情况。

相关文章
|
28天前
|
存储 安全 iOS开发
内存卡怎么格式化?6个格式化方法供你选
随着使用时间的增加,内存卡可能会因为数据积累、兼容性或是文件系统损坏等原因需要进行格式化。那么怎样正确格式化内存卡呢?格式化内存卡的时候需要注意什么呢?本文会给大家提供详细的步骤,帮助大家轻松完成格式化内存卡的操作。
|
16天前
|
监控 安全 网络安全
深入解析PDCERF:网络安全应急响应的六阶段方法
PDCERF是网络安全应急响应的六阶段方法,涵盖准备、检测、抑制、根除、恢复和跟进。本文详细解析各阶段目标与操作步骤,并附图例,助读者理解与应用,提升组织应对安全事件的能力。
174 89
|
2月前
|
安全 Ubuntu Shell
深入解析 vsftpd 2.3.4 的笑脸漏洞及其检测方法
本文详细解析了 vsftpd 2.3.4 版本中的“笑脸漏洞”,该漏洞允许攻击者通过特定用户名和密码触发后门,获取远程代码执行权限。文章提供了漏洞概述、影响范围及一个 Python 脚本,用于检测目标服务器是否受此漏洞影响。通过连接至目标服务器并尝试登录特定用户名,脚本能够判断服务器是否存在该漏洞,并给出相应的警告信息。
188 84
|
2月前
|
数据可视化 项目管理
个人和团队都好用的年度复盘工具:看板与KPT方法解析
本文带你了解高效方法KPT复盘法(Keep、Problem、Try),结合看板工具,帮助你理清头绪,快速完成年度复盘。
102 7
个人和团队都好用的年度复盘工具:看板与KPT方法解析
|
15天前
|
人工智能 监控 数据可视化
提升开发效率:看板方法的全面解析
随着软件开发复杂度提升,并行开发模式下面临资源分配不均、信息传递延迟及缺乏全局视图等瓶颈问题。看板工具通过任务状态实时可视化、流量效率监控和任务依赖管理,帮助团队直观展示和解决这些瓶颈。未来,结合AI预测和自动化优化,看板工具将更高效地支持并行开发,成为驱动协作与创新的核心支柱。
|
3月前
|
监控 JavaScript Java
Node.js中内存泄漏的检测方法
检测内存泄漏需要综合运用多种方法,并结合实际的应用场景和代码特点进行分析。及时发现和解决内存泄漏问题,可以提高应用的稳定性和性能,避免潜在的风险和故障。同时,不断学习和掌握内存管理的知识,也是有效预防内存泄漏的重要途径。
208 52
|
2月前
|
存储 Java 开发者
浅析JVM方法解析、创建和链接
上一篇文章《你知道Java类是如何被加载的吗?》分析了HotSpot是如何加载Java类的,本文再来分析下Hotspot又是如何解析、创建和链接类方法的。
|
3月前
|
传感器 人工智能 物联网
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
82 6
|
2月前
|
负载均衡 网络协议 算法
Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式
本文探讨了Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式,以及软件负载均衡器、云服务负载均衡、容器编排工具等实现手段,强调两者结合的重要性及面临挑战的应对措施。
108 3
|
3月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。

热门文章

最新文章

推荐镜像

更多