Day-7
问题
请讲讲你理解的c++中的引用和指针
参考答案
引用
是某一变量的别名,而指针
的值是一个地址,通过它能找到以它为地址的内存单元。
区别:
- 指针本身就是一个对象,而引用不是对象,C++中
对象
是一块能存储数据并具有某种类型的内存空间 - 指针不一定需要初始化,而引用必须被初始化,且引用的初始值必须是一个对象
- 指针在使用中可以指向其它对象,但是引用只能是一个对象的引用,不能被改变
- 指针可以有多级指针,比如指向指针的指针,而引用只有一级,一个引用不能再指向另一个引用
- 使用
sizeof
看一个指针的大小是4,而引用则是被引用对象的大小 - 指针和引用的自增(++)和自减(- -)含义不同,指针是指针运算,而引用是代表所指向的对象执行++或- -
更深一层:汇编层面的理解
对于代码
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)
对比后可以发现,在汇编底层,对引用的处理和对常量指针的处理一模一样。所以可以得出结论:引用可以理解为加了各种限制(比如必须初始化、必须指向一个对象)的常量指针。