[每天一道面试题 c++] Day7 请讲讲你理解的c++中的引用和指针

Day-7

问题

请讲讲你理解的c++中的引用和指针

参考答案

引用是某一变量的别名,而指针的值是一个地址,通过它能找到以它为地址的内存单元。

区别:

  1. 指针本身就是一个对象,而引用不是对象,C++中对象是一块能存储数据并具有某种类型的内存空间
  2. 指针不一定需要初始化,而引用必须被初始化,且引用的初始值必须是一个对象
  3. 指针在使用中可以指向其它对象,但是引用只能是一个对象的引用,不能被改变
  4. 指针可以有多级指针,比如指向指针的指针,而引用只有一级,一个引用不能再指向另一个引用
  5. 使用sizeof看一个指针的大小是4,而引用则是被引用对象的大小
  6. 指针和引用的自增(++)和自减(- -)含义不同,指针是指针运算,而引用是代表所指向的对象执行++或- -

更深一层:汇编层面的理解

参考:知乎回答:C++中,引用和指针的区别是什么?

对于代码

int i=5;
int &ri=i;
ri=8;

反汇编得到:

0x100000f9d <main()+13> movl   $0x5,-0x8(%rbp)
0x100000fa4 <main()+20> lea    -0x8(%rbp),%rcx
0x100000fa8 <main()+24> mov    %rcx,-0x10(%rbp)
0x100000fac <main()+28> mov    -0x10(%rbp),%rcx
0x100000fb0 <main()+32> movl   $0x8,(%rcx)

而对于代码

int i=5;
int* const pi=&i;
*pi=8;

反汇编得到的还是

0x100000f9d <main()+13> movl   $0x5,-0x8(%rbp)
0x100000fa4 <main()+20> lea    -0x8(%rbp),%rcx
0x100000fa8 <main()+24> mov    %rcx,-0x10(%rbp)
0x100000fac <main()+28> mov    -0x10(%rbp),%rcx
0x100000fb0 <main()+32> movl   $0x8,(%rcx)

对比后可以发现,在汇编底层,对引用的处理和对常量指针的处理一模一样。所以可以得出结论:引用可以理解为加了各种限制(比如必须初始化、必须指向一个对象)的常量指针。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值