天天看點

C++中引用和指針的差別

1. 引用其實就是一個别名,它用于定義一個變量共享另一個變量的記憶體空間,變量是記憶體空間的名字,如果給記憶體空間起另外一個名字,就能夠共享這個記憶體。

2. 指針則是指向一個記憶體空間的變量,可以通過指針來檢視某個記憶體空間的内容,而指針本身在32位機器下占據4個位元組的空間

指針和引用的差別有以下幾個方面

(1)指針是一個存放變量位址的變量,它可以被改變即可以指向不同的位址空間;

         引用隻是一個别名,它的存在是具有依附性的,引用必須一開始就初始化,并且引用的對象不能被改變隻能引用某一個對象。

(2)指針作為函數參數傳遞的時候實際上是值傳遞的方式,隻要不修改形參指針指向記憶體空間的值,任何對形參指針的修改對實參都是沒有影響的;如果要在形參中改變引起實參改變可以使用指針的指針或指針引用。

         引用作為函數參數傳遞的時候實際上對形參引用的修改就是直接修改實參對象。

(3)指針的值可以改變;引用隻能在定義的時候初始化一次,之後就不能更改了。

(4)指針可以為NULL;引用不能為NULL,引用必須對應某個存儲單元。

(5)對指針求sizeof結果是4;對引用求sizeof是對象的大小。

(6)如果要傳回動态配置設定的記憶體必須使用指針,不能使用引用。

         char *p = (char *)malloc(4*sizeof(char)) 或 char *p = new char[4]

舉例:

1. int x = 5;

    int y = 10;

    int *a = &x //指針a指向x的位址

    int &b = a  //引用b是a記憶體空間的一個别名

    a = &y       //指針a可以指向y的位址

    b = y         //這個時候操作b相當于a的值變成了10,此時a和b的值都是10

    int &c = NULL //這個是錯誤的,沒有空引用

    int *d = NULL  //這個是正确的,有空指針

2. 函數是使用

    void Fun(int *p){} //如果實參是指針,函數形參也是指針,這個時候實際上是值傳遞,隻要不修改p指向記憶體空間的内容,其它的任何對形參的操作對實參都是沒有影響的

    void Fun(int **p){} //如果實參是指針,可以利用指針的指針來傳遞,這個時候實際上是位址傳遞對形參的修改就是修改實參

    void Fun(const int &a){} //常量引用,保證函數體隻是對引用a隻讀,而無法修改,提高效率

繼續閱讀