区别:
1. 指针是对象,引用不是;
2. 声明引用必须初始化,声明指针可以不初始化(但一般建议初始化);
3. 指针可以绑定新的对象(花心大萝卜),而引用不可以(从一而终);
4. 在作为参数时,引用要比指针高效,因为指针要发生实参到形参的拷贝,而引用不需要。
实现机制:底层都是指针,都要分配内存(至少从汇编层面看是这样的)
1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 int i = 100, other = 999; 7 int &rr = i;//必须初始化 8 int *p = &i;//可以不初始化 9 10 return 0; 11 }
瞧一瞧汇编
7: int &rr = i;//必须初始化 00401056 lea eax,[ebp-4] 00401059 mov dword ptr [ebp-0Ch],eax 8: int *p = &i;//可以不初始化 0040105C lea ecx,[ebp-4] 0040105F mov dword ptr [ebp-10h],ecx
lea eax,[ebp-4] //将【ebp-4】中的值的地址存入eax中(也就是把ebp-4存入eax中)mov dword ptr [ebp-0Ch],eax //将eax的地址存入地址为【ebp-0ch】的指针中
指针和引用在汇编里头看是一毛一样的,可见引用还是用指针来实现的,没什么稀奇。
值传递、指针传递、引用传递
值传递: 实参初始化形参,二者互不影响;
指针传递: 发生了指针的拷贝,还是两个对象,但是指向同一块内存/对象,可以通过形参指针修改对象值;
引用传递: 别名,不发生拷贝,可以直接使用原对象,但我们一般用const限定常量引用,防止该值。const string &s;