[C++基礎]019_指標和引用(int*、int&、int*&、int&*、int**)

來源:互聯網
上載者:User

相信很多CPPers跟我一樣,曾經在指標和引用裡徘徊了很久很久。經常弄混指標和引用,尤其是見到如題中列出那些用法,著實是傷腦經。

後來,在項目中用著用著,就能搞清楚區別了,算是會用吧。然而,對於一個Programmer,最忌諱的就是不知其所以然,會用和懂是兩番天地。停留在會用的人,始終是原地打轉;而懂的人,一通百通,能舉一反三。

本文,就如題的指標和引用的用法做一個介紹。

首先我們來普及一下概念,說明一下什麼是指標和引用,這裡借用一下變數名作為過渡。

      ■指標 ---- 指向某一塊記憶體的變數,其本身儲存的資訊就是記憶體位址的首地址,其類型決定指向記憶體的大小。             比喻,超市的儲物櫃。我記住我放包的柜子在第一排右起第三個,這裡的1-3就是一個地址,通過地址,我可以找到柜子。這裡的地址就是一個指標。      ■變數 ---- 某一塊記憶體位址資料值的名字             比喻,超市的儲物櫃。我記住我放包的柜子上有一張貼紙,上面寫著18,通過18,我可以找到柜子。這裡的18,就是變數名了。      ■引用 ---- 變數的別名             比喻,超市的儲物櫃。柜子的貼紙上面寫著18,但是18不好記,我用諧音記憶法,把18想成“要發”,通過“要發”,也可以找到柜子。這裡“要發”就是一個引用。

通過上面的比喻可以看出來,要找到柜子,有三種方法:

1. 第一排右起第三個                      地址(指標)2. 柜子貼紙上號為18的                    變數名3. “要發”                              引用

 

理解了指標、引用的概念,我們來看看它們的使用吧,這裡以經典的值交換為例,來說明int、int*、int&、int*&、int&*、int**。

1. int

 1 #include <iostream> 2 using namespace std; 3  4 void swap1(int a, int b){ 5     int tmp; 6     tmp = a; 7     a = b; 8     b = tmp; 9 }10 int main(){11     int a = 1;12     int b = 2;13     swap1(a, b);14     cout<<"a = "<<a<<endl;15     cout<<"b = "<<b<<endl;16     system("pause");17     return 0;18 }

交換失敗。基礎牢靠的同學一眼就看出來,這樣的交換隻是交換了形參的值,是無法達到交換值的效果的,這段程式很簡單,不做細說。

 

2. int*

#include <iostream>using namespace std;void swap2(int *a, int *b){    int tmp;    tmp = *a;    *a = *b;    *b = tmp;}int main(){    int a = 1;    int b = 2;    swap2(&a, &b);    cout<<"a = "<<a<<endl;    cout<<"b = "<<b<<endl;    system("pause");    return 0;}

交換成功。上面是的swap2接受的參數是地址,我們傳入地址,就可以直接操作實參的值了,這個也很簡單,不做細說。

 

3. int&

#include <iostream>using namespace std;void swap3(int& a, int& b){    int tmp;    tmp = a;    a = b;    b = tmp;}int main(){    int a = 1;    int b = 2;    swap3(a, b);            cout<<"a = "<<a<<endl;    cout<<"b = "<<b<<endl;    system("pause");    return 0;}

交換成功。引用即別名,通過引用也是可以直接存取到實參和控制實參的,這裡不做細說。

4. int*&

 1 #include <iostream> 2 using namespace std; 3  4 void swap5(int *&a, int *&b){ 5     int tem = *a; 6     *a = *b; 7     *b = tem; 8 } 9 10 int main(){11     int a = 1;12     int b = 2;13 14     int *aPtr = &a;15     int *bPtr = &b;16     int *&arPtr = aPtr;17     int *&brPtr = bPtr;18 19     swap5(arPtr, brPtr);20 21     cout<<"a = "<<a<<endl;22     cout<<"b = "<<b<<endl;23     system("pause");24     return 0;25 }

交換成功。這個稍微複雜一點,int*&  value這樣一個聲明,我們從最接近value的符號看起,是個&,說明value是一個引用,它是一個什麼引用呢?再看*,它是一個指標的引用,即指標的別名,我們用*value就可以訪問到實參的值了。所以,其交換函數的內部邏輯跟int *是一樣的。

 

5. int &*

交換成功。這樣定義就不合法,如果從字面上來看,我們分析一下,如int &* value,最接近value的是*,說明value是一個指標,再看前面的是&,說明是一個指標的引用,而指標是無法被引用的,所以,這樣的定義是不合法的,不要記這個。

 

6. int**

 1 #include <iostream> 2 using namespace std; 3  4 void swap6(int **a, int **b){ 5     int tmp; 6     tmp = **a; 7     **a = **b; 8     **b = tmp; 9 }10 11 int main(){12     int a = 1;13     int b = 2;14     int *aPtr = &a;//指向資料的指標15     int *bPtr = &b;//指向資料的指標16     int **aaPtr = &aPtr;//指向指標的地址的指標17     int **bbPtr = &bPtr;//指向指標的地址的指標18     swap4(aaPtr, bbPtr);19     cout<<"a = "<<a<<endl;20     cout<<"b = "<<b<<endl;21     system("pause");22     return 0;23 }

交換成功。同樣的,比如int **value, 最接近value的是*,說明value是一個指標,在前一個是*,說明是一個指向指標的指標,這樣是合法的,那麼如何訪問value代表的實際參數的值呢?很簡單,用**value就可以了,記住*是一個操作符,如同&一樣,不過&是取地址操作符,而*是取值操作符。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.