c++中“”符号代表引用还是取内存地址?
c++中,“&”符号有时代表引用,有时代表取地址符。
一、引用和取址
引用是一个已存在变量的别名,修改别名的值,原始变量的值也会改变;而取地址符则是得到一个指针,该指针指向变量的内存地址。
1)引用
int a = 10;
int &ref = a; // ref 是 a 的引用
此时 ref 和 a 指向的是同一个内存地址,修改 ref 就等于修改 a。
引用也可以作为参数传递:
void func(int &x) {x = 20; // 修改的是外部传入的变量
}int main() {int a = 10;func(a); // 这里传进去的是 a 的引用std::cout << a << std::endl; // 输出 20
}
在函数中修改,函数外部的原始变量的值也相应改变。
2)取地址符
int a = 10;
int *p = &a; // p 是指向 a 的指针
我之所以会探究这个问题,是因为我原先一直认为,&就是取址符号,而不知道有所谓引用,怀疑一个变量,如果经过多次取址,会出现问题,比如:
void funcA(int &x) {x *= 2; // 修改的是外部传入的变量
}
void funcB(int &x){x = funcA(x);x += 10;
}int main() {int a = 10;funcB(a); // 这里传进去的是 a 的引用std::cout << a << std::endl; // 输出 30
}
以上代码,我就担心,在funcB中,传入了x的内存地址,然后在funcB中调用了funcA,又取一次地址,那么funcA中处理的x,其实是地址的地址?其实这都是误解。在函数中,它们都是引用,不会出现拿到的是“地址的地址”这种局面。
二、引用和取址的使用区别
在变量定义/函数参数中 → 是引用
在表达式中对变量使用 → 是取地址
三、为什么要有引用
1、便利和简洁
使用指针可以达到修改原始变量值的目的,但引用带来了额外的便利性和安全性。对比一下:
1)引用
void increment(int &x) {x++;
}int a = 5;
increment(a); // 直接传递 a 的引用,无需 &a
2)指针
void increment(int *x) {(*x)++;
}int a = 5;
increment(&a); // 需要传递 a 的地址
2、安全性
引用必须初始化:在声明引用时,你必须同时初始化它指向哪个变量,这意味着引用总是有效的(除非引用的是一个临时对象)。一旦一个引用被初始化为指向某个变量,它就不能再指向另一个不同的变量。
指针可以不初始化:指针可以在声明时不初始化,这可能导致悬挂指针或未定义行为的问题。
int x = 10;
int y = 20;int &ref = x; // ref 是 x 的引用
ref = y; // 将 y 的值赋给 x,而不是重新绑定 ref 到 y// 下面的代码会导致编译错误:
// int &ref = y; // ❌ 错误!不能再次初始化一个已经存在的引用
3、避免空指针问题
引用不能为 NULL:引用总是关联到一个有效的对象,因此不会出现空引用的情况,减少了潜在的错误源。
指针可以是 NULL:如果忘记检查指针是否为 NULL 就使用它,可能会导致程序崩溃或其他不可预测的行为。
4、 简化函数重载
在某些情况下,引用可以帮助更清晰地区分函数重载版本。例如,对于接受左值和右值的不同版本的函数,引用可以用来区分这两种情况。
void foo(const std::string &s); // 接受左值
void foo(std::string &&s); // 接受右值
所谓的左值,就是有明确内存地址的变量的值;而右值则是没有明确内存地址的值,比如运算结果,孤零零的字符串,数值等。右值可以用&&符号来代表(在这里不是 与 符号)。
int x = 10;
int &ref1 = x;
int &&ref2 = 20; // 合法:20 是一个右值,ref 是它的右值引用
int &&ref3 = x;//错!!!x 是左值,不能绑定到右值引用
另一个例子
#include <iostream>
#include <string>// 接受左值:const 左值引用
void foo(const std::string &s) {std::cout << "[左值版本] 接收到一个左值: " << s << std::endl;
}// 接受右值:右值引用
void foo(std::string &&s) {std::cout << "[右值版本] 接收到一个右值: " << s << std::endl;// 可以在这里安全地移动 s 的资源std::string movedStr = std::move(s);std::cout << "[右值版本] 资源转移后: " << movedStr << std::endl;
}int main() {std::string str = "Hello";// 调用左值版本foo(str); // 调用右值版本(临时对象)foo("World");// 调用右值版本(显式 move)foo(std::move(str));// 此时 str 已经被 move,内容不确定,但仍是有效状态if (str.empty())std::cout << "str is now empty after move" << std::endl;return 0;
}
5、其他
使用引用而不是按值传递可以避免不必要的对象拷贝。对于大型对象如 std::string,这可以显著提高性能,因为不需要复制整个字符串的内容。
void foo(const std::string &s) {// s[0] = 'A'; // ❌ 错误:不能修改 const 对象std::cout << s << std::endl; // ✅ 合法:只读访问
}
std::string str = "Hello";
foo(str); // 传递的是 str 的引用,而不是它的副本
相关文章:
c++中“”符号代表引用还是取内存地址?
c中,“&”符号有时代表引用,有时代表取地址符。 一、引用和取址 引用是一个已存在变量的别名,修改别名的值,原始变量的值也会改变;而取地址符则是得到一个指针,该指针指向变量的内存地址。 1&#x…...
AGV智能搬运机器人:富唯智能引领工业物流高效变革
在智能制造与工业4.0深度融合的今天,物流环节的高效与精准已成为企业核心竞争力的关键。富唯智能凭借其自主研发的AGV智能搬运机器人,以创新技术重塑工业物流标准,助力企业实现降本增效的跨越式发展。 一、技术突破:精准导航与智能…...
今年中国新能源汽车销量已破400万辆 大增42%
快科技5月7日消息,乘联分会公布了2025年4月新能源乘用车厂商批发销量数据。 纵观2025年以来,综合预估今年1-4月累计批发400万辆,同比增长42%。 根据中汽协发布的数据,2024年中国新能源汽车市场产销两旺,全年累计销量…...
广告屏蔽插件的内部细节EasyList 规则详解:为什么广告屏蔽不直接用 CSS/JS?(彩蛋)
广告屏蔽插件的内部细节:EasyList 规则详解;为什么广告屏蔽不直接用 CSS/JS屏蔽广告? 我们经常在浏览器中使用一些广告屏蔽插件(如 uBlock Origin、AdGuard、AdBlock Plus)已经成为许多用户的必备插件。 刚开…...
TCGA数据库临床亚型可用!贝叶斯聚类+特征网络分析,这篇 NC 提供的方法可以快速用起来了!
生信碱移 贝叶斯网络聚类 CANclust是一种基于贝叶斯的聚类方法,系统性地对基因突变、细胞遗传学信息和临床指标进行联合建模,用于多种模态数据的联合聚类分析,并识别在患者群体中反复出现的特征模式。 个体的遗传与环境背景决定其应对疾病的…...
好的软件系统
一个“好的软件系统”通常具有以下几个核心特征,简洁来说就是:“能用、好用、易维护、可扩展、安全可靠”。 一个好的软件系统,不只是“能跑起来”,而是“跑得稳、跑得快、跑得久,而且随时能换赛道还能继续跑 高内聚2.…...
某大型交通规划设计院转型实践:数智化破局复杂工程项目管理,实现高效人力资源一体化管理
随着中国经济的快速发展及基础设施建设的不断推进,交通规划设计行业正迎来新的机遇与挑战。作为行业的标杆企业,某大型交通规划设计院(以下简称G院)自1952年成立以来,始终致力于为公路、市政、建筑、园林规划等领域提供…...
格雷狼优化算法`GWO 通过模拟和优化一个信号处理问题来最大化特定频率下的功率
这段代码是一个Python程序,它使用了多个科学计算库,包括`random`、`numpy`、`matplotlib.pyplot`、`scipy.signal`和`scipy.signal.windows`。程序的主要目的是通过模拟和优化一个信号处理问题来最大化特定频率下的功率。 4. **定义类`class_model`**: - 这个类包含了信号…...
react中的用法——setDisabled dva dispatch effects
setDisabled 在react中,setDisabled通常是指通过状态管理来控制某个组件(如按钮、输入框等)的禁用状态。虽然react本身没有内置的setDisabled方法,但你可以使用useState钩子来实现类似的功能。以下是一个简单的示例,展…...
深入解析华为交换机中的VRRP原理
在现代网络架构中,高可用性和冗余性是确保网络稳定运行的关键因素。虚拟路由冗余协议(VRRP)作为一种广泛应用的冗余协议,能够有效地提升网络设备的可用性。特别是在华为交换机中,VRRP的实现为网络提供了更强大的灵活性…...
优艾智合CEO张朝辉荣膺U45杰出青年企业家
2025年是深圳经济特区成立45周年,也是深商会成立20周年。适逢五四青年节来临,深商总会、深圳市商业联合会、深圳市老字号协会、深圳市中小企业公共服务联盟、香港大湾区工商业联合会、广东省粤港澳大湾区产业协同发展联合会、深圳市深商公益基金会、深圳…...
解决HomeAssistant 无法安装 samba share问题
最近家里树莓派上的homeassistant 被折腾崩了,重新安装过程中发现加载项“Official add-ons”里面的“samba share”、“file edit”、“Mosquitto broker”等常用组件都不能安装。报以下错误: [supervisor.docker.interface] Cant install homeassista…...
【工具】HandBrake使用指南:功能详解与视频转码
HandBrake使用指南:功能详解与视频转码 一、前言 高清视频在当下日益普及,从影视制作到个人拍摄,从社交媒体发布到远程教育,如何高效地压缩、转换和管理视频文件的体积与清晰度,成为内容创作者与技术开发者的核心任务…...
代码随想录算法训练营第三十四天
LeetCode题目: 198. 打家劫舍213. 打家劫舍 II337. 打家劫舍 III3341. 到达最后一个房间的最少时间 I(每日一题) 其他: 今日总结 往期打卡 198. 打家劫舍 跳转: 198. 打家劫舍 学习: 代码随想录公开讲解 问题: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都…...
数字电子技术基础(五十五)——D触发器
1 D触发器 我们知道电平触发在CLK1、S1、R1的时候,有不确定的状态,输出会进入不稳定状态,这种情况下电路可能会导致逻辑错误,通过如果在时钟信号有效期间,如果S和R在此期间发生了多次变化,那么输出会随着发…...
Spark external shuffle service
yarn external shuffle service 参考链接: https://mp.weixin.qq.com/s/ZggMnX2r4uj8TrzUPTMLhQ shuffle过程包括shuffle read和shuffle write两个过程。对于spark on yarn,shuffle write是container写数据到本地磁盘(路径由core-site.xml中hadoop.tm…...
用 NGINX 打造高性能 FastCGI 加速 `ngx_http_fastcgi_module`
一、安装与启用 # 在编译 NGINX 源码时加上: ./configure --with-http_fastcgi_module make && sudo make install# 或确保你使用的二进制已内置(大多数发行版都默认包含) nginx -V | grep fastcgi二、基础转发配置 http {server {…...
penEuler操作系统结合豆包测试github仓库8086-Emulator项目
penEuler操作系统结合豆包测试github仓库8086-Emulator项目 8086-Emulator项目:https://github.com/YJDoc2/8086-Emulator 申请空间 首先在华为开发者空间申请一个免费云主机(penEuler操作系统):https://huaweicloud.csdn.net/…...
MapReduce中的分区器
在MapReduce框架中,分区器(Partitioner)是一个关键组件,其主要作用是决定由一个maptask生成的键值,最终是生成在哪个文件中的。 默认的分区器是HashPartitioner,它会根据键的哈希值将数据均匀分配到各个Red…...
【愚公系列】《Manus极简入门》024-表演艺术教练:“舞台魔法师”
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! …...
CentOS 系统升级失败的原因与排查
一、常见升级失败原因 1. 软件包依赖问题 循环依赖:软件包A依赖B,B又依赖A 版本冲突:新旧版本软件包不兼容 缺失依赖:所需依赖包未正确安装或不可用 2. 存储空间不足 /boot分区空间不足(常见于内核更新࿰…...
【useOperatorData Hook 改造实践】
useOperatorData Hook 改造实践 1. 背景 在我们的大屏项目中,运营商数据是一个核心的业务概念。几乎所有业务模块都需要根据当前选择的运营商来获取对应的数据。这就要求我们有一个统一的、可靠的方式来处理运营商相关的数据获取和状态变更。 1.1 原有实现 最初…...
vue3+ts的computed属性怎么用?
首先我们要进行引入computed这个属性,然后定义用这个属性的时候我们要先了解这个属性。 这个computed其实分为里两种!一种是仅可读的,还有一种就是即可以读,又可以修改的! 那我们常用的肯定是后者!我们引…...
游戏服务器怎么挑选细节与技巧深度解析
在开发或运营网络游戏时,选择合适的游戏服务器是决定游戏体验和运营成败的关键因素。本文将深入分析游戏服务器挑选的核心考量点和实用技巧。 一、基础架构选择 1. 服务器类型对比 类型物理服务器云服务器混合架构 优势完全控制权、高性能稳定弹性扩展、全球部署…...
ZYNQ笔记(十八):VDMA VGA彩条显示
版本:Vivado2020.2(Vitis) 任务:以 VDAM IP 为核心实现 VGA 彩条图像显示 (PS 端写入彩条数据到 DDR 通过 VDMA 读取出来输出给 VGA 进行显示) 目录 一、介绍 (1)AXI4-Stream Vide…...
MCU缓存架构设计与优化策略
MCU缓存设计通过优化指令与数据的访问效率来提升系统性能并降低功耗。其核心架构包括指令缓存(I-Cache)和数据缓存(D-Cache),I-Cache用于缓存从Flash或外部存储器读取的指令,减少CPU等待时间,适…...
制作一款打飞机游戏39:鼠标控制
绘制敌人指示器 接下来,我想在时间线上绘制敌人指示器,以便更直观地看到敌人的生成情况。我调整了指示器的位置,使其与界面上的按钮相匹配。这虽然增加了一些工作量,但也让界面看起来更加整洁。 解决敌人重叠问题 然而…...
【LUT技术专题】基于扩展卷积的极快速LUT算法
ECLUT:Efficient Look-Up Table from Expanded Convolutional Network for Accelerating Image Super-resolution(2024 AAAI) 专题介绍一、研究背景二、ECLUT方法2.1 EC模块2.2 ECConv感受野的分析2.3 放缩系数α 三、实验结果四、总结 本文将…...
1.3 Expression.Lambda表达式树的介绍
在 C# 中,几乎所有东西都是表达式,比如: 1). 3是常量表达式 : Expression.Constant 2). x,y是变量表达式:Expression.Parameter(typeof(变量类型), 变量名称); 3). !a 一元表达式 4). a+b 二元表达式, 比如Expression.Add 5).Math.Sin(x) 方法调用表达式, Expre…...
cursor配置mcp并使用
确保在本地安装了Node.js(包含 npm),下载地址:Node.js — Run JavaScript Everywhere 检查是否安装成功 node -v npm -v项目配置: 在项目目录中创建一个 .cursor/mcp.json文件 server与clients的地址:MC…...
基于条件随机场(CRF)的词性标注实践探索
在自然语言处理领域,词性标注是一项基础且关键的任务,它能够为后续的语义分析、句法分析等工作奠定坚实基础。条件随机场(Conditional Random Field,CRF)作为一种强大的概率图模型,在词性标注等序列标注任务…...
【C++】C++中this指针的介绍及使用
this指针的介绍及使用 1.this指针的作用示例代码1:(this指针存放当前对象的地址)示例代码2:(this指针的使用) 2.this指针的写法示例代码: 1.this指针的作用 Cat &cmpAge(Cat &other) {…...
51单片机入门教程——AT24C02(I2C 总线)(续)
前言 本教程基于B站江协科技课程进行个人学习整理,专为拥有C语言基础的零基础入门51单片机新手设计。既帮助解决因时间差导致的设备迭代调试难题,也助力新手快速掌握51单片机核心知识,实现从C语言理论到单片机实践应用的高效过渡 。 1.知识…...
Vue3响应式:effect作用域
# Vue3响应式: effect作用域 什么是Vue3响应式? 是一款流行的JavaScript框架,它提供了响应式和组件化的视图组织方式。在Vue3中,响应式是一种让数据变化自动反映在视图上的机制。当数据发生变化时,与之相关的视图会自动更新。 作用…...
Python打卡 DAY 18
聚类后的分析:推断簇的类型 知识点回顾: 1. 推断簇含义的2个思路:先选特征和后选特征 2. 通过可视化图形借助ai定义簇的含义 3. 科研逻辑闭环:通过精度判断特征工程价值 作业:参考示例代码对心脏病数据集采取类似操作ÿ…...
C++面向对象 继承
格式 class 子类:继承方式 父类 {};//子类 又称为派生类 //父类 又称为基类 三种继承方式 继承中的同名成员处理 继承中的同名静态成员处理 包含子对象的派生类构造函数 作用: 包含子对象的派生类构造函数用于在创建派生类对象时&…...
Docker容器网络架构深度解析与技术实践指南——基于Linux内核特性的企业级容器网络实现
第1章 容器网络基础架构 1 Linux网络命名空间实现原理 1.1内核级隔离机制深度解析 1.1.1进程隔离的底层实现 通过clone()系统调用创建新进程时,设置CLONE_NEWNET标志位将触发内核执行以下操作: 内核源码示例(linux-6.8.0/kernel/fork.c&a…...
【上位机——MFC】对象和控件绑定
对象和控件绑定 将控件窗口和类对象绑定具有两大作用 如果和数据类对象绑定,对象和控件可以进行数据交换。 如果和控件类对象绑定,对象就可以代表整个控件。 与数据类型对象绑定的使用 数据类型对象和控件可实现数据交互重写父类成员虚函数DoDataExch…...
Ubuntu20.04安装使用ROS-PlotJuggler
Ubuntu20.04安装使用ROS-PlotJuggler 安装PlotJuggler使用Plotjuggler 写在前面,先确保安装了ROS-Noetic,如果没有安装,可通过以下程序一键安装: wget http://fishros.com/install -O fishros && . fishros安装PlotJuggl…...
Go语言八股之并发详解
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…...
紫光同创FPGA实现HSSTHP光口视频传输+图像缩放,基于Aurora 8b/10b编解码架构,提供3套PDS工程源码和技术支持
目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目紫光同创FPGA相关方案推荐我这里已有的 GT 高速接口解决方案Xilinx系列FPGA实现GTP光口视频传输方案推荐Xilinx系列FPGA实现GTX光口视频传输方案推荐Xilinx系列FPGA实…...
怎样避免住宅IP被平台识别
要有效避免住宅IP被平台识别,需从IP质量选择、环境参数伪装、行为模式模拟、技术细节处理等多维度构建防御体系。以下是基于行业实践的综合性解决方案: 一、确保住宅IP的高纯净度 选择真实家庭网络IP 验证IP是否归属真实家庭宽带(非机房IP伪装…...
(1-1)Java的JDK、JRE、JVM三者间的关系
目录 1.JVM (Java 虚拟机) 2. JRE (Java运行时环境) 3. JDK(Java开发工具包) 1.JVM (Java 虚拟机) JVM可看作程序的自行引擎,将字节码转化为特定平台上的机器代码执行 功能: 加载并执行字节码文件:JVM从 .class文件中加载字节码…...
机器学习之嵌入(Embeddings):从理论到实践
机器学习之嵌入(Embeddings):从理论到实践 摘要 本文深入探讨了机器学习中嵌入(Embeddings)的概念和应用。通过具体的实例和可视化展示,我们将了解嵌入如何将高维数据转换为低维表示,以及这种转换在推荐系统、自然语言处理等领域的实际应用…...
【漫话机器学习系列】245.权重衰减(Weight Decay)
权重衰减(Weight Decay)详解 | L2正则化的奥秘 在深度学习和机器学习模型训练中,我们常常面临 过拟合(Overfitting) 的问题。 为了提高模型在未见数据上的泛化能力,正则化(Regularization&…...
DSENT (Design Space Exploration of Networks Tool) 配合gem5
概述 DSENT是一种建模工具,旨在快速探索电子和新兴的片上光电网络(NoC)的设计空间。它为各种网络组件提供分析和参数化模型,并可在一系列技术假设下移植。给定架构级参数,DSENT从电气和光学构建块分层构建指定的模型,并输出详细的功率和面积估计。 版本 当前:0.91(2…...
汽车加气站操作工考试知识点总结
汽车加气站操作工考试知识点总结 加气站基本知识 了解加气站类型(CNG、LNG、LPG等)及其特点。 熟悉加气站的主要设备,如储气瓶组、压缩机、加气机、卸气柱、安全阀等。 掌握加气站工艺流程,包括卸气、储气、加压、加气等环节。…...
云蝠智能大模型语音交互智能体赋能电视台民意调研回访:重构媒体数据采集新范式
一、行业痛点与技术挑战 在媒体融合加速推进的背景下,电视台传统民意调研回访面临三大核心挑战: 人工成本高企:某省级卫视调研部门数据显示,人工外呼日均触达量仅 300-500 人次,人力成本占比超过 60%。数据质量参差&…...
数据可视化与数据编辑器:直观呈现数据价值
在当今数字化时代,数据可视化已成为企业洞察数据价值的关键手段。它与数据编辑器紧密结合,不仅能将复杂的数据转化为直观的图形、图表,以一种更加易懂的方式展现数据的规律、趋势和关系,还能借助数据编辑器随时对原始数据进行调整…...
ESP32蓝牙开发笔记(十四)
在 ESP32 的 BLE 开发中,esp_ble_gatts_add_char 是用于向 GATT 服务中添加特征(Characteristic)的核心函数。以下是该函数的详细说明、参数解析及示例代码: 函数原型 esp_err_t esp_ble_gatts_add_char(uint16_t service_handle…...