天天看點

C++指針與引用的差別(手寫)

指針和引用都是在寫程式的時候經常用到的。通過指針和引用我們可以通過傳形參來靈活的改變相關的參數。比如做交換時

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|
           

但是指針就不一樣了,因為指針為一個位址空間,它存儲着被指向對象的位址。是以它可以随時改變被指向的對象。

C++指針與引用的差別(手寫)

(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;
           

這裡的輸出結果為:

C++指針與引用的差別(手寫)

(7) 在進行相關的參數傳遞時,指針是形參的拷貝,而引用為實參的傳遞。就是說指針作為形參的時候,接受到的是一個實參的位址。而引用作為形參的時候就是給形參另起了一個别名(直接操作實參)

C++指針與引用的差別(手寫)

(8)不存在引用的引用(難道外号還有外号嗎?),但是存在指向指針的指針(因為指針存在相關的記憶體空間)

(9)對于自增符号來說,指針的自增為指向位址的改變,而引用的自增為被引用數的改變。

                簡單來說:指針配置設定空間,存儲着被指向對象的位址。但是引用隻是一個别名而已,并不為其配置設定存儲空間。

C++指針與引用的差別(手寫)