C++指针和引用之区别(The Difference between C++Pointers and References)

面试题:C++指针和引用有什么区

C++指针和引用有什么区别?

在 C++ 中,指针和引用都是用来访问其他变量的值的方式,但它们之间存在一些重要的区别。了解这些区别有助于更好地理解和使用这两种工具。

01

指针

指针(Pointer)

定义:

指针是一个变量,它存储了一个内存地址。

指针的类型是指向的数据的类型。

声明:

指针通常用星号 * 来声明,例如 int *p; 表示 p 是一个指向 int 类型的指针。

赋值:

指针可以通过赋值操作来指向不同的地址,例如 p = &a;,其中 &a 是变量 a 的地址。

指针可以指向 nullptr 或 NULL(在 C++11 之后推荐使用 nullptr)表示不指向任何对象。

解引用:

使用星号 * 来解引用指针并访问它所指向的数据,例如 *p = 10;。

内存管理:

指针需要手动分配和释放内存(使用 new 和 delete)。

指针可以指向任何类型的内存,包括未初始化的内存区域。

安全性

使用指针时需要特别小心,因为访问无效或已释放的内存可能导致程序崩溃或未定义行为。

代码示例:

#include <iostream>
int main() {    int a = 10;    int *p = &a;  // p 指向 a    *p = 20;      // 修改 a 的值    std::cout << "a: " << a << std::endl;  // 输出 20
    p = nullptr;  // p 不再指向任何东西    *p = 30;      // 错误!p 为 nullptr    return 0;}

02

引用

引用(Reference)
定义

引用是一个别名,它是一个已经存在的变量的另一个名字。

引用不是真正的变量,它不占用额外的存储空间。

声明

引用通常用 & 符号声明,例如 int &r = a; 表示 r 是变量 a 的引用。

赋值

引用一旦初始化后就不能更改,也就是说,不能重新绑定到另一个对象。一旦绑定后,引用始终指向同一个对象。

初始化时必须立即绑定到一个对象,不能是 nullptr。

解引用:

引用本身就是一个左值(可以出现在赋值的左边),因此不需要解引用即可访问其绑定的对象,例如 r = 10;。

内存管理:

引用本身不涉及内存分配,它只是现有对象的一个别名。

引用通常用于传递大对象或作为函数返回值,以避免不必要的拷贝。

安全性:

使用引用相对安全,因为引用总是有效,不会指向不存在的对象。

代码示例:

#include <iostream>
int main() {    int a = 10;    int &r = a;  // r 是 a 的引用    r = 20;      // 修改 a 的值    std::cout << "a: " << a << std::endl;  // 输出 20
    // 下面的语句是非法的,因为引用不能重新绑定到另一个对象    // int b = 30;    // r = b;  // 错误!r 不能重新绑定
    return 0;}03

引用不占用内存空间

看下面示例代码:

#include <iostream>
int main() {    int a = 9;    int& b = a;  // b 是 a 的引用    int* p = &a;
    std::cout << "a 的地址: " << &a << std::endl;    std::cout << "b 的地址: " << &b << std::endl;    std::cout << "p 的地址:" << &p << std::endl;
    return 0;}

运行输出:

可以看到引用b的地址和变量a的地址是一样的,b就是a的一个别名,它不涉及到额外的内存分配。但是指针p是一个变量,指针本身也会占用内存。

在 C++ 中,引用的内存分配如下:

变量 a:

分配一块内存空间存储 a 的值。

引用 b:

不需要分配新的内存空间,它直接绑定到 a 上。

因此,无论在代码中创建多少个引用,它们都不会占用额外的内存空间,只会占用现有变量的内存。

04
总结

指针:

指针是一个变量,存储地址。

指针本身占用存储空间。

指针可以初始化为空,可以重新指向其他地址。

引用:

引用不是一个变量,而是现有变量的别名。

引用本身不占用存储空间。

引用不能初始化为空,一旦初始化后不能重新绑定到另一个对象

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

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

相关文章

LWIP学习笔记

TCP/ip协议结构分层 传输层简记 TCP&#xff1a;可靠性强&#xff0c;有重传机制 UDP&#xff1a;单传机制&#xff0c;不可靠 UDP在ip层分片 TCP在传输层分包 应用层传输层网络层&#xff0c;构成LWIP内核程序&#xff1a; 链路层&#xff1b;由mac内核STM芯片的片上外设…

【经验记录贴】活用shell,提高工作效率

背景 最近在做测试的时候&#xff0c;需要手动kill服务的进程&#xff0c;然后通过命令重启服务&#xff0c;再进行测试。每次重启都会涉及到下面三个命令的执行&#xff1a; 1&#xff09;检索进程ID $ ps -eLf | grep programname root 1123 112 1234 0 0 0 0:00…

MacOS 系统下 Git 的详细安装步骤与基础设置指南

MacOS 系统下 Git 的详细安装步骤与基础设置指南—目录 一、安装 Git方法 1&#xff1a;通过 Homebrew 安装&#xff08;推荐&#xff09;方法 2&#xff1a;通过 Xcode Command Line Tools 安装方法 3&#xff1a;手动下载安装包 二、基础配置1. 设置全局用户名和邮箱2. 配置 …

一文读懂 AI

2022年11月30日&#xff0c;OpenAI发布了ChatGPT&#xff0c;2023年3月15日&#xff0c;GPT-4引发全球轰动&#xff0c;让世界上很多人认识了ai这个词。如今已过去快两年半&#xff0c;AI产品层出不穷&#xff0c;如GPT-4、DeepSeek、Cursor、自动驾驶等&#xff0c;但很多人仍…

【教程】检查RDMA网卡状态和测试带宽 | 附测试脚本

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 检查硬件和驱动状态 测试RDMA通信 报错修复 对于交换机的配置&#xff0c;可以看这篇&#xff1a; 【教程】详解配置多台主机通过交换机实现互…

计算机网络 - TCP协议

通过一些问题来讨论 TCP 协议 什么是 TCP &#xff1f;举几个应用了 TCP 协议的例子TCP协议如何保证可靠性&#xff1f;tcp如何保证不会接受重复的报文&#xff1f;Tcp粘包拆包问题了解吗&#xff1f;介绍一下&#xff0c;如何解决&#xff1f;TCP拥塞控制与流量控制区别&…

Fiddler 进行断点测试:调试网络请求

目录 一、什么是断点测试&#xff1f; 二、Fiddler 的断点功能 三、如何在 Fiddler 中设置断点&#xff1f; 步骤 1&#xff1a;启动 Fiddler 步骤 2&#xff1a;启用断点 步骤 3&#xff1a;捕获请求 步骤 4&#xff1a;修改请求或响应 四、案例&#xff1a;模拟登录失…

OpenCv高阶(三)——图像的直方图、图像直方图的均衡化

目录 一、直方图 1、计算并显示直方图 2、使用matplotlib方法绘制直方图&#xff08;不划分小的子区间&#xff09; 3、使用opencv的方法绘制直方图 &#xff08;划分16个小的子亮度区间&#xff09; 4、绘制彩色图像的直方图&#xff0c;将各个通道的直方图值都画出来 二、…

Flutter 与原生通信

Flutter 与原生之间的通信主要基于通道机制&#xff0c;包括 MethodChannel、EventChannel 和 BasicMessageChannel。 MethodChannel&#xff1a;用于 Flutter 与原生之间的方法调用&#xff0c;实现双向通信&#xff0c;适合一次性的方法调用并获取返回值&#xff0c;如 Flut…

前端面试-Vue篇

核心概念 Vue 3的响应式原理与Vue 2有何本质区别&#xff1f;Vue中虚拟DOM的diff算法优化策略有哪些&#xff1f;Vue组件间通信方式有哪些&#xff1f;适用场景分别是什么&#xff1f;Vue的生命周期钩子在Composition API中如何替代&#xff1f;Vue的模板编译过程是怎样的&…

光刻机研发与市场现状分析报告

1. 引言 光刻机&#xff08;Lithography Machine&#xff09;是半导体制造的核心设备&#xff0c;其技术水平和市场供应能力直接影响全球芯片产业的发展。随着人工智能&#xff08;AI&#xff09;、5G、高性能计算&#xff08;HPC&#xff09;和自动驾驶等技术的兴起&#xff0…

Missashe考研日记-day21

Missashe考研日记-day21 1 专业课408 学习时间&#xff1a;4h学习内容&#xff1a; 今天先把昨天学的内容的课后习题做了&#xff0c;整整75道啊&#xff0c;然后学了OS第二章关于CPU调度部分的内容&#xff0c;这第二章太重要了&#xff0c;以至于每一小节的内容都比较多&am…

【玩转全栈】—— Django+vue3+讯飞星火API 实现前端页面实时AI答复

技术栈&#xff1a;vue3 element-plus axios pinia router Django5 websocket 讯飞星火API 本文将实现一个 AI 聊天对话功能&#xff0c;将前端用户输入问题以及之前对话发送给后端&#xff0c;通过 api 访问大模型&#xff0c;返回前端实时对话数据。 调用 讯飞星火API…

广东广州一家IPO资产重组疑点重重,信息披露真实性存疑

作者&#xff1a;Eric 来源&#xff1a;IPO魔女 4月18日&#xff0c;广州瑞立科密汽车电子股份有限公司&#xff08;简称“瑞立科密”&#xff09;将接受深交所主板IPO上会审核。公司保荐机构为中信证券&#xff0c;拟募集资金为15.2162亿元。 瑞立科密过往资产重组疑点重重&a…

银河麒麟(Kylin) - V10 SP1桌面操作系统ARM64编译QT-5.15.12版本

银河麒麟(Kylin) - V10 SP1桌面操作系统ARM64编译QT-5.15.12版本 原因 测试Kylin-Desktop-V10-SP1-General-Release-2303-arm64系统下&#xff0c;编译QT-5.15.12版本已做测试。 测试环境 测试板配置 型号&#xff1a;LM-D2000-NONE-1w-V01-pc_A2150 CPU&#xff1a;飞腾D20…

查看前端项目依赖树型结构关系图的详细方法,涵盖 命令行工具 和 可视化工

以下是查看前端项目依赖树型结构关系图的详细方法&#xff0c;涵盖 命令行工具 和 可视化工具&#xff1a; 一、命令行工具生成依赖树 1. npm # 查看项目依赖树&#xff08;文本形式&#xff09; npm ls# 查看指定包的依赖树 npm ls <package-name># 生成JSON格式的依…

Ollama高并发测试

本文主要来测试一下ollama的高并发能力。 具体配置如下&#xff1a; 一、Ollama默认参数执行 我们打开4个窗口&#xff0c;然后分别让DeepSeek “给我讲一个笑话” &#xff0c;看下不同窗口的答题顺序。 通过答题顺序可以看到&#xff0c;在不进行参数设置时&#xff0c;模…

资源管理与HPA:让Kubernetes应用自动伸缩

引言&#xff1a;从“手动挡”到“自动驾驶” 想象我们驾驶一辆汽车&#xff0c;手动调节油门和换挡不仅费力&#xff0c;还难以应对突发状况。我们的应用服务也一样&#xff0c;在面对突然的流量增长&#xff0c;内存使用暴涨该如何应对。HPA&#xff08;Horizontal Pod Auto…

Windows 下 MongoDB ZIP 版本安装指南

在开发和生产环境中&#xff0c;MongoDB 是一种非常流行的 NoSQL 数据库&#xff0c;以其灵活性和高性能而受到开发者的青睐。对于 Windows 用户来说&#xff0c;MongoDB 提供了多种安装方式&#xff0c;其中 ZIP 版本因其灵活性和轻量级的特点&#xff0c;成为很多开发者的首选…

【Linux网络与网络编程】11.数据链路层mac帧协议ARP协议

前面在介绍网络层时我们提出来过一个问题&#xff1a;主机是怎么把数据交给路由器的&#xff1f;那里我们说这是由数据链路层来做的。 网络上的报文在物理结构上是以mac帧的形式流动的&#xff0c;但在逻辑上是以IP流动的&#xff0c;IP的流动是需要mac帧支持的。 数据链路层解…