区别:

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;