指針和引用都是在寫程式的時候經常用到的。通過指針和引用我們可以通過傳形參來靈活的改變相關的參數。比如做交換時
void swapdata(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}
或者通過指針
void swapdata(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
差別:
(1)引用被建立時一定要被初始化,否則就會報錯。但是指針就不同了,它可以随時随地初始化(想什麼時候初始化就初始化)。未被初始化的指針将指向随機的位址,這樣就會造成隐患
'b' declared as reference but not initialized|
(2)引用一旦被指向一個對象,就不能再指向另一個對象了。如果改變就會編譯出錯
就好比小明有一天被起了個外号叫狗蛋,那麼我一想起狗蛋就知道是小明。然後呢小剛有被起了個外号也叫狗蛋.那麼狗蛋到底是小明呢還是小剛呢(二義性)。
int a=100;
int &b=a;
int c=200;
&b=c;
lvalue required as left operand of assignment|
但是指針就不一樣了,因為指針為一個位址空間,它存儲着被指向對象的位址。是以它可以随時改變被指向的對象。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL0sGVOFTU61ENNpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL2ETMxATNzkDM2EDNwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
(3)引用必須是一個合法的引用,也就是說null引用不存在
(4)引用不配置設定記憶體單元,而指針配置設定相關的記憶體單元(間接引用)。
(5)沒有const引用,但存在const指針.因為引用一旦被初始化就無法再改變了,是以const也就沒得用了
(6)sieof(引用) 傳回的是被引用對象的大小,而sizeof(指針)傳回的是被指向對象的位址的大小
double a=100;
double &b=a;
double *c=&a;
cout<<"a變量的大小="<<sizeof(a)<<" "<<"a變量的大小="<<sizeof(b)<<" "<<"a位址的大小="<<sizeof(c)<<endl;
這裡的輸出結果為:
(7) 在進行相關的參數傳遞時,指針是形參的拷貝,而引用為實參的傳遞。就是說指針作為形參的時候,接受到的是一個實參的位址。而引用作為形參的時候就是給形參另起了一個别名(直接操作實參)
(8)不存在引用的引用(難道外号還有外号嗎?),但是存在指向指針的指針(因為指針存在相關的記憶體空間)
(9)對于自增符号來說,指針的自增為指向位址的改變,而引用的自增為被引用數的改變。