面试官:说说C++的引用和指针有什么区别

C++中的引用和指针虽然都是用于间接访问和操作对象的工具,但它们之间存在几个重要的区别:

  • 本质和存在性:
    指针是一个变量,它存储了另一个变量的地址。指针有自己的内存地址,并且可以改变其指向的内容。
    引用是一个别名,是已存在变量的另一个名字。引用没有自己的内存地址,它只是原变量的一个标识符。

  • 初始化:引用必须在声明时初始化,并且一旦初始化后,就不能再指向其他对象。而指针则可以在任何时候被重新赋值,指向其他对象。

int a = 10;  
int& ref = a; // 引用必须在声明时初始化  
int* ptr;     // 指针可以先不初始化  
ptr = &a;     // 指针可以在任何时候被重新赋值
  • 空值:引用不能为空,它总是指向某个对象。而指针可以是空(nullptr 或 NULL),表示它不指向任何对象。
int* ptr = nullptr; // 指针可以是空  
// int& ref = nullptr; // 这是错误的,引用不能为空
  • 内存分配:引用本身并不占用内存空间(它只是对象的一个别名),而指针是一个对象,需要分配内存来存储地址。

  • 运算:可以对指针进行各种运算,如加法、减法、比较等,这些运算通常用于数组和动态内存管理。而引用不支持这些运算,它更像是一个变量的别名,而不是一个独立的对象。

int arr[10];  
int* ptr = &arr[0];  
ptr++; // 指针可以移动  
// ref++; // 这是错误的,引用不支持这样的运算
  • 解引用:通过指针访问其指向的对象需要使用解引用运算符(*),而引用则不需要。
int a = 10;  
int* ptr = &a;  
cout << *ptr; // 输出 10,需要解引用  
int& ref = a;  
cout << ref;  // 输出 10,不需要解引用
  • 函数参数和返回值:引用在函数参数和返回值方面特别有用,因为它们允许函数修改其调用者的变量,而无需使用指针。同时,由于引用总是指向有效的对象,这也可以提高代码的安全性和可读性。
void modify(int& x) {  x = 20; // 修改引用指向的变量  
}  int main() {  int a = 10;  modify(a); // 调用函数,a 的值将被修改为 20  cout << a; // 输出 20  return 0;  
}

引用和指针都是C++中用于间接访问和操作对象的工具,但它们各自具有不同的特性和用途。在选择使用引用还是指针时,应根据具体需求来决定。引用在语法上更加简洁,使用起来也更加安全,但在某些需要灵活操作内存地址的场合,指针则是不可或缺的。

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

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

相关文章

springboot271制造装备物联及生产管理ERP系统

制造装备物联及生产管理ERP系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装制造装备物联及…

3月14日,每日信息差

&#x1f396; 素材来源官方媒体/网络新闻 &#x1f384; 5.5G通信网络在海南投入商用&#xff0c;较5G提升10倍 &#x1f30d; 国务院批复同意&#xff0c;珠海港口岸将整合并扩大开放 &#x1f30b; 同有科技&#xff1a;正在研究新型磁电存储技术 &#x1f381; 美国折扣零售…

考研模拟面试-答案【攻略】

考研模拟面试-答案【攻略】 前言版权推荐考研模拟面试-答案前面的问题通用问题专业题数据结构计算机网络操作系统数据库网络安全 手写题数据结构操作系统计算机网络 代码题基础代码题其他代码题 后面的问题补充题目 基础代码题答案链栈循环队列1循环队列2哈希表 最后 前言 202…

Oracle基础-分组查询 备份

一、概述 数据分组的目的是用来汇总数据或为整个分组显示单行的汇总信息&#xff0c;通常在查询结果集中使用GROUP BY 子句对记录进行分组。在SELECT 语句中&#xff0c;GROUP BY 子句位于FROM 子句之后&#xff0c;语法格式&#xff1a; SELECT columns_list FROM table_nam…

【测试知识】业务面试问答突击版1

高内聚低耦合 高内聚指的是将相关的功能或数据组织在一起&#xff0c;使得模块内部的各个元素紧密地联系在一起&#xff0c;完成特定的任务。 低耦合指的是模块之间的依赖关系尽可能地降低&#xff0c;模块之间的接口简单清晰&#xff0c;减少模块之间的相互影响。 文章目录 整…

【数据结构】二叉搜索树底层刨析

文章目录 1. 二叉搜索树的实现2. 二叉搜索树的应用3. 改造二叉搜索树为 KV 结构4. 二叉搜索树的性能分析 1. 二叉搜索树的实现 namespace key {template<class K>struct BSTreeNode{typedef BSTreeNode<K> Node;Node* _left;Node* _right;K _key;BSTreeNode(const…

工作中用到的 —— 工作总结提炼出来的股文

这里是目录 ---------------- VUE相关 -----------------1 - Vue3 是怎么得更快的&#xff1f;1-1 Fragment [frɡˈment]1-2 Suspense [səˈspens]1-3 Teleport [ˈtelipɔːt]1-4 v-memo 2- 说一下 Composition API3- 说一下 setup4- watch 和 watchEffect 的区别5- Vue3 响…

Sublime查看ANSI编码文档乱码问题

原因为没有安装对应的解码插件。 选择安装插件包 选择插件包&#xff1a;ConvertToUTF8或者GBK&#xff0c;我试了第一个插件包不行&#xff0c;安装GBK插件包后OK。

Git如何清除账户凭证

场景&#xff1a;一般发生在Git用户变更的情况 1.git base 操作 Git会使用凭证助手 credential.helper来储存账户凭证&#xff0c;通过以下命令移除&#xff1a; git config --system --unset credential.helper 除了system系统级外&#xff0c;还有 global、local范围。 查…

20万英文单词同义词宝典ACCESS\EXCEL数据库

英语同义词反义词的数据之前搞到过《近万英语单词同义词典ACCESS数据库》、《上百万英语同义反义词词典ACCESS数据库》&#xff0c;今天又搞到一份几十万行数据的&#xff0c;发上来看看有没有适合朋友们的需求。 今天这个数据提供了非常全的词汇单词以及词汇对应的含义以及近…

将Java项目Jar包制作成Docker镜像

文章目录 前言一、准备事项二、使用步骤1.Dockerfile脚本2.制作镜像推送Harbor仓库前言 以前单体项目通常采用传统部署方式将项目打成Jar包再进行部署。如果我们项目是微服务则需要进行Docker容器部署。本文将介绍如何在本地将Jar包制作成Docker镜像并推送到Harbor仓库 一、准…

Spring揭秘:ClassPathScanningProvider接口应用场景及实现原理!

技术应用场景 ClassPathScanningCandidateComponentProvider是Spring框架中一个非常核心的类&#xff0c;它主要用于在类路径下扫描并发现带有特定注解的组件&#xff0c;支持诸如ComponentScan、Component、Service、Repository和Controller等注解的自动扫描和注册。 ClassP…

Mysql 无法启动,mysql-bin.日志丢失删除处理

在linux操作系统中&#xff0c;当mysql无法启动时候&#xff0c;先看日志 2024-03-15T05:20:16.352075Z 0 [Warning] [MY-000081] [Server] option max_allowed_packet: unsigned value 107374182400 adjusted to 1073741824. 2024-03-15T05:20:16.352156Z 0 [Warning] [MY-010…

Marshmallow,一个有点甜的Python库

前言 在许多场景中&#xff0c;我们常常需要执行Python对象的序列化、反序列化操作。例如&#xff0c;在开发REST API时&#xff0c;或者在进行一些面向对象化的数据加载和保存时&#xff0c;这一功能经常派上用场。 经常cv Python代码的臭宝&#xff0c;接触最多的应该是通过…

验证与分享执行计划突变引发的问题

作者简介 张瑞远&#xff0c;曾经从事银行、证券数仓设计、开发、优化类工作&#xff0c;现主要从事电信级IT系统及数据库的规划设计、架构设计、运维实施、运维服务、故障处理、性能优化等工作。 持有Orale OCM,MySQL OCP及国产代表数据库认证。 获得的专业技能与认证包括 Oce…

被军训到的两天

1.gradle7.6.1 1.安装gradle7.6.1,一定要注意的是&#xff0c;使用的JDK是否能用&#xff0c;比如gradle7.6.1用的是JDK11。 2. F:/sofer....是Gradle自己的仓库地址&#xff0c;注意不能和maven使用一样的仓库。 使用specified location,可以避免下本项目的gradle版本&…

如何更改SonarQube的JDK版本

如何更改SonarQube的JDK版本 当需要升级或更换SonarQube所使用的JDK版本时&#xff0c;可以按照以下步骤进行操作&#xff1a; 第一步&#xff1a;确定新JDK的安装路径 首先&#xff0c;您需要找到您打算使用的JDK的安装路径。这通常是一个包含JDK各种工具和库的文件夹。请确…

ego - 人工智能原生 3D 模拟引擎——基于AI的3D引擎,可以做游戏、空间计算、元宇宙等项目

1. 产品概述:Ego是一款AI本地化的3D模拟引擎,旨在让非技术创作者通过自然语言生成逼真的角色、3D世界和交互式脚本。该平台提供了创建和分享游戏、虚拟世界和交互体验的功能。 2. 定位:Ego定位于解决开放世界游戏和模拟的三大难题:难以编写游戏脚本、非玩家角色无法展现人…

性能测试-Redis

一、测试注意点 1、缓存预热 如果程序初次运行&#xff0c;此时由于数据尚未加载到缓存&#xff0c;则程序的响应时间会明显变长 注意事项&#xff1a; 性能测试的时候 出现 非常不稳定的现象程序刚启动&#xff0c;它的性能 明显 低于 已经运行一段时间的 1.1 测试缓存没…

基于SQL语句的数据脱敏实现方法

文章目录 要解决什么背景Jsqlparser安全系统难点目标 方法语法树遍历实现初始化第一轮第二轮第三轮 总结 要解决什么 企业进行软件开发、数据分析、数据查询时&#xff0c;不可避免的涉及到数据安全的问题&#xff0c;不同人员能看到的数据不同&#xff0c;如何识别哪些敏感数…