詳解c++ 引用(reference)與 指針(pointer)的區別與聯繫

引用(reference) 與指針(pointer)之間有什麼區別和聯繫呢?我相信,對於很多初學c++的程序猿來說,不是一件簡單的事.那麼在c++中,引用與指針到底有什麼聯繫和區別呢?要弄清楚這個問題,我們必須明白 :
1.什麼是引用?
2.怎樣使用引用?
3.引用的使用場合?
4.引用與指針有什麼聯繫和區別?
下面容小生一一爲各位詳細道來?
1.什麼是引用?
要明白什麼是引用,我們就必須明白c++ 爲什麼要引入引用? c++ 在某些程度來說,是c的一個擴充和改善,我們知道,c程序一個非常顯著的優勢就是c程序的執行效率,而c高效執行的原因就是對指針的操作(直接對內存進行操作),小生相信,對於絕大部分c程序員來說,對指針是又愛又恨,愛它,是因爲 ,c語言指針所帶來的效率是其它程序無法比擬的,恨它,我想,小生也沒必要多說了,對指針操作不慎所帶來的bug,相信大家都深有體會吧,而c++ 語言設計之初,c++委員會,即想保持c指針的高效,又不想有指針的缺點,所以就引入了引用這一概念,但是後來,卻發現,指針沒法被引用取代。好了,說了這麼多,那到底什麼是引用呢?
引用(reference): 引用只是別名,不是實體類型(也就是說c++編譯器不爲引用單獨分配內存空間),對一個對象的引用,就是直接對這個對象的操作。
`int a = 3; //定義了一個整形變量a,並且賦初值3
int & ra = a;//定義了一個引用 ra ,ra與變量佔有同一塊內存空間
a = 4; //此時 a 與ra 的值都爲 4;
ra = 5;//此時 a 與 ra的值都是5;

2.怎樣使用引用?
(1)引用必須初始化(引用必須指向所引用的對象)

int a = 3;
int& ra = a;
int &b ;//錯誤,引用必須初始化
const int &b = 10;//正確對字面值常量10的引用

(2)引用不能爲空

int &b ;//錯誤,引用不能爲空必須有所引用的對象

`
(3)引用不能更換目標

#include<iostream>
using namespace std;
int main(void){
    int a = 3;
    int b = 4;
    int& ra = a;
    // int& ra = b;//錯誤,多次初始化

    return 0;
}

3.引用的使用場合?
(1)引用型參數(函數形參只是實參的別名,也就是說形參和實參是同一個對象)
使用引用型參數有兩個好處:(1)因爲函數形參和實參是同一個對象,也就不存在對象複製,避免了對象的開銷。(2)可以在修改形參的同時對實參的修改。
當然了,爲了避免函數對原來實參的意外修改我們可以 用const 對引用加以修飾 也就是傳常引用。傳常引用有兩個優勢(1)因爲不存在拷貝構造所以,可以提高c++程序的執行效率(2)避免對象切割問題。關於這點的詳細討論可以看effective c++ 。
(2)引用型返回值
從函數中返回引用,一定要保證在函數返回以後,被引用的目標一直有效,也就是不能返回函數體內的局部對象的引用,大家都知道, 局部對象離開作用域就會被析構掉,所以不能返回對函數體內的局部對象的引用。

4.引用與指針的聯繫與區別?
囉嗦了這麼久 ,現在終於回到我們的正題,引用與指針到底有什麼區別和聯繫了,其實,在c++底層中,引用是通過指針實現的。也就是說,在實現層面上,引用就是指針,但是從c++的程序語言層面上來說,引用不是實體類型(不爲引用單獨分配內存空間)因此,引用與指針之間的區別主要體現在以下幾個方面:
(1)存在空指針,但是不存在空引用

void * a;//空指針,合法
//void& b;//空引用,不合法

(2)雖然c++編譯器會警告,但是指針可以不初始化,而引用必須初始化,並且,引用的目標一旦確定,後面不能再更改,指針可以更改其指向的目標。

#include<iostream>
using namespace std;

int main(void){
    void * a;
    //void& b;

    int x = 1;
    int y = 2;
    int z = 3 ;
    //指針c可以不初始化,可以更改其指向的目標,
    int * c;
    c = &x;
    c = &y;

    //引用必須初始化,不可以更改其指向的目標
    //int& ra ;//報錯,ra 必須要指定初值
    int & ra = x;
    ra = y;//這裏只是把y的值賦給 ra 也就是x 而並不是使引用的目標由 對x的引用到對y的引用


    return 0;
}

(3)存在指針數組 ,不存在引用數組

int* a[3] ={&x,&y,&z };//定義了一個有三個整形指針變量的指針數組 a ,合法
    //int& a [3] ={x,y ,z};//報錯,不允許使用引用數組,因爲引用沒有內存的分配

5.學海拾貝
大家在使用引用和指針時,只要記住一點就夠了,在c++底層中,引用是通過指針實現的,所以,在實現層面上來說,引用就是指針,但是在c++語法上來說,c++編譯器並不爲引用類型分配內存,所以引用不能爲空,必須被初始化,一旦初始化不能更改引用對象。所有對引用的操作都是對原始對象的操作

發佈了31 篇原創文章 · 獲贊 15 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章