当前位置: 首页 > news >正文

编程笔记 - C++ 引用和指针的区别

在 C++ 中,指针(Pointer)和引用(Reference)都用于间接访问变量,但是它们在语法和语义上都有显著的差异。指针是一个变量,它可以保存另一个变量的内存地址;引用是另一个变量的别名,由编译器进行处理,使用时与使用原变量无异。

指针和引用使用的一些差异如下:

初始化

指针:可以先定义后赋值,也可以指向不同的对象。

int a = 10, b = 20;
int* p = &a;
p = &b; // 改变指向

引用:必须在定义时就进行初始化,绑定到一个特定的对象,并且不能绑定到其他的对象。

int a = 10, b = 20;
int& r = a;  
r = b; // 修改的是 a 的值,而不是重新绑定,等价于 a=b

可空性

指针:可以被定义为 nullptr,表示不指向任何对象。

引用:必须绑定有效对象,不能为 null,否则会产生为定义的行为。

内存占用

指针:由于存储的是内存地址,因此需要占用内存空间,一般为 32 bit 或 64 bit。

引用:语义上不占用内存空间,实际可能由编译器实现为一个隐藏指针。

这里我们参考一篇博客: C++ 中指针和引用的区别(汇编分析) | 编程指北-计算机学习指南 。

参考以下使用引用和指针实现的 swap 函数。

void swap(int &a, int &b) {int temp = a;a = b;b = temp;
}void swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;
}

引用版本 swap() 函数的汇编代码如下:

# void swap(int &a, int &b)
__Z4swapRiS_:                           ## @_Z4swapRiS_.cfi_startproc
## %bb.0:pushq   %rbp.cfi_def_cfa_offset 16.cfi_offset %rbp, -16movq    %rsp, %rbp          .cfi_def_cfa_register %rbpmovq    %rdi, -8(%rbp)         # 传入的第一个参数存放到%rbp-8  (应该是采用的寄存器传参,而不是常见的压栈)movq    %rsi, -16(%rbp)        # 第二个参数 存放到 %rbp-16movq    -8(%rbp), %rsi         # 第一个参数赋给 rsimovl    (%rsi), %eax           # 以第一个参数为地址取出值赋给eax,取出*a暂存寄存器movl    %eax, -20(%rbp)        # temp = amovq    -16(%rbp), %rsi        # 将第二个参数重复上面的movl    (%rsi), %eaxmovq    -8(%rbp), %rsi    movl    %eax, (%rsi)           # a = bmovl    -20(%rbp), %eax        # eax = tempmovq    -16(%rbp), %rsimovl    %eax, (%rsi)           # b = temppopq    %rbpretq.cfi_endproc## -- End function

指针版本 swap() 函数的汇编代码如下:

# void swap(int *a, int *b)
__Z4swapPiS_:                           ## @_Z4swapPiS_.cfi_startproc
## %bb.0:pushq   %rbp.cfi_def_cfa_offset 16.cfi_offset %rbp, -16movq    %rsp, %rbp.cfi_def_cfa_register %rbpmovq    %rdi, -8(%rbp)movq    %rsi, -16(%rbp)movq    -8(%rbp), %rsimovl    (%rsi), %eaxmovl    %eax, -20(%rbp)movq    -16(%rbp), %rsimovl    (%rsi), %eaxmovq    -8(%rbp), %rsimovl    %eax, (%rsi)movl    -20(%rbp), %eaxmovq    -16(%rbp), %rsimovl    %eax, (%rsi)popq    %rbpretq.cfi_endproc## -- End function

可以看到,两个函数的汇编代码几乎完全一致。引用所赋的初值也就是绑定对象的内存地址,访问和修改对象内容也是通过这个内存地址完成的。

既然引用和指针的底层实现机制几乎没有区别,那么为什么我们需要使用引用呢?我认为有以下两点:

  • 便捷性:能够让使用者使用引用与使用对象本身一致,由编译器自动进行取地址、解引用的操作。
  • 安全性:引用必须初始化,且不能更换绑定,避免了悬空指针和野指针的问题,这在接口设计中更可靠,要求必须传入合法的对象。
http://www.hskmm.com/?act=detail&tid=26543

相关文章:

  • 题解:P14127 [SCCPC 2021] K-skip Permutation
  • 题解:[P11184 带余除法]
  • 10 8
  • 2025双氧水厂家权威推荐榜:优质生产与稳定供应实力之选
  • 英国AI数据中心发展规划:技术挑战与产业反馈
  • 2025 年工业风机厂家最新推荐排行榜:涵盖离心高温防腐耐磨防爆等类型设备实力厂商精选高温/防腐/耐磨/防爆/除尘/不锈钢/锅炉风机厂家推荐
  • 2025 年拉力试验机厂家最新推荐榜单:聚焦专精特新企业技术实力与口碑,助力钢铁、线缆、轨道交通等行业精准选购
  • 2025 年最新推荐!种植牙医院权威榜单:聚焦连锁品牌与万级手术室,助您精准选靠谱口腔机构西宁种植牙口腔医院/西宁种植牙齿美容/西宁种植牙美容医院推荐
  • 高考数学易错考点01 | 临阵磨枪 - 教程
  • 2025 年西宁口腔医院最新推荐排行榜:实力解析与全周期口腔服务指南西宁口腔医院/西宁口腔美容/西宁口腔整形/西宁口腔正畸/西宁口腔修复推荐
  • 2025 年试验机厂家最新推荐榜单:专精特新企业深度解析,含疲劳 / 压力 / 液压万能等设备优质厂家水泥压力/压剪/锚链拉伸整形机/链条拉伸整形机厂家推荐
  • 2025 年最新推荐西安路灯厂家排行榜:市政 / LED / 智慧 / 太阳能 / 农村路灯优质企业全景指南
  • 2025 最新红绿灯厂家推荐排行榜:实力厂家技术与口碑深度解析,交通信号设备优选指南交通信号/路口红绿灯厂家推荐
  • 2025 土工材料厂家最新推荐榜:中铁合作厂商领衔,技术 / 案例双维度厂家深度甄选指南土工布/土工膜/土工格栅/复土工合膜厂家推荐
  • 2025 年帐篷源头厂家最新推荐排行榜:涵盖应急救灾 / 户外充气 / 露营充气 / 野营等品类,精选实力企业助采购
  • Claude Code完整安装部署指南:支持Windows/Linux/macOS三平台详细教程
  • 2025 杀虫公司最新推荐榜:权威筛选公司,靶向消杀与长效质保选购全指南
  • 2025 年电缆桥架生产厂家最新推荐榜单:聚焦北方 / 河北区域及多类型桥架,精选优质品牌深度解析瓦楞/防火/模压/镀锌桥架厂家推荐
  • rtthread学习笔记系列 -- 13 线程
  • 2025 年淋膜机厂家最新推荐排行榜:覆盖纸张 / 无纺布 / 高速 / 全自动等多类型设备,精选优质企业助力精准选购
  • 2021年度十大前沿科技研究盘点
  • 2025 商事律师咨询最新推荐榜:权威甄选专业法律服务品牌武汉公司法商事/武汉股东纠纷股权/武汉商事争议解决/武汉公司法股权律师推荐
  • 2025 最新推荐:全国开锁公司口碑排行榜权威甄选,含智能锁专项服务与紧急上门品牌详解全国/汽车保险柜/汽车锁/保险柜/智能/快速上门开锁公司推荐
  • CSP - J 讲义内容与CSP - S 讲义内容对比
  • 云安全挑战与AI时代防护策略
  • python“锈化”库替代,性能更快的库
  • 大语言模型时代计算语言学新进展
  • 用新媒体给产业园招商 - 智慧园区
  • 30年后摘得诺奖,一个叛逆“东亚小孩”的胜利
  • 2025年诺贝尔物理学奖揭晓,其中两位得主曾获“墨子量子奖”