#include<iostream> using namespace std; int main() { int a = 10; char b = 'a'; int *p1 = &a; char *p2 = &b; int &q1 = a; char &q2 = b; cout<<sizeof(p1)<<" "<<sizeof(p2)<<endl; //4 4 cout<<sizeof(q1)<<" "<<sizeof(q2)<<endl; //4 1 }二、引用要进行初始化,而且一经初始化没法再改用,而指针能够更换指向,引用的底层实现是const *;
int main() { int a = 10; int b = 20; int *p1; //int &q1; error because:引用必需要初始化 int &q1 = a; //&q1 = b; error because:一经引用不可更改 p1 = &a; p1 = &b;//ok 指针是OK的 int **pp1 = &p1;//存在多级指针 不存在多级引用 cout<<*p1<<endl; //20 指针要配合*使用,才能取值 cout<<q1<<endl; //10 引用则不须要,直接就能够解引用 return 0; }五、从汇编角度来看,定义引用和指针的汇编是如出一辙的,都是先把该变量的地址放到寄存器里面,再把寄存器的值交给指针或者引用变量的地址里。
int *p1 = &a; 00B44EF9 lea eax,[a] 00B44EFC mov dword ptr [p1],eax
int &q1 = a; 00B44F05 lea eax,[a] 00B44F08 mov dword ptr [q1],eax使用指针和引用的汇编也是同样同样的,先从变量中取地址值,而后根据地址值找到里面存放的值。
cout<<*p1; //20 指针要配合*使用,才能取值 01083604 mov esi,esp 01083606 mov eax,dword ptr [p1] 01083609 mov ecx,dword ptr [eax] 0108360B push ecx 0108360C mov ecx,dword ptr ds:[1091380h] 01083612 call dword ptr ds:[1091384h] 01083618 cmp esi,esp 0108361A call __RTC_CheckEsp (0108132Ah) cout<<q1; //10 引用则不须要,直接就能够解引用 0108361F mov esi,esp 01083621 mov eax,dword ptr [q1] 01083624 mov ecx,dword ptr [eax] 01083626 push ecx 01083627 mov ecx,dword ptr ds:[1091380h] 0108362D call dword ptr ds:[1091384h] cout<<q1; //10 引用则不须要,直接就能够解引用 01083633 cmp esi,esp 01083635 call __RTC_CheckEsp (0108132Ah)
六、指针和引用的自增(++)运算意义不同(指针移动的是地址,引用移动的是对象自己)ios