天天看點

C++中的指針和引用

定義一個變量,它有四個次元:類型、名字、位址、值

了解:

指針的值是:位址

指針是存放變量位址的變量,邏輯上是獨立的,它可以被改變,包括所指向的位址的改變及所指向位址中存放的資料的改變。

引用:一個對象的别名,值是這個對象的名字,改變對象和引用,對值有同樣的影響。

引用是一個别名,邏輯上不是獨立的,它的存在具有依附性,是以定義時必須初始化,并且不能改變指向。

用法:

int a=8;

int& ra=a;

int* p=&a;

使用時,可以直接使用ra,與使用a的效果一樣;但是使用p,結果是位址,要取得值,使用*p。

差別:

1.引用不可以為空,定義的時候必須初始化;指針可以為空,不要求一定初始化。

聲明指針時,可以不指向任何對象,也是因為這個原因,使用指針之前需要做判空操作,引用就不需要。

2.引用不可以改變指向,對一個對象”至死不渝“;而指針可以改變指向,指向其他對象。

    int i=10;

    int& ref=i;

    ref++;

    int j=20;

    ref=j;

雖然引用不可以改變指向,卻可以改變所指向的值,以上的結果是:ref仍然指向i,隻是将i的值改變為j的值,ref的改變不會對j産生任何影響。

3.引用的大小是它所指對象的大小;指針的大小是本身,4個位元組(sizeof()=4)。

特别标明一點,無論string類型的變量裡存放多長的字元串,sizeof()的值是固定的,字元串所占的空間是從堆中動态配置設定的,與sizeof()無關,sizeof(string)=4可能是最典型的

實作之一,不過也有sizeof()為12、32位元組的庫實作。我們一般接觸到的string類型所占位元組數為 8+。

4.引用比指針使用形式上漂亮:

定義引用後,在程式中使用時可以直接使用引用名,但是指針除了在定義時需要使用*,指派時需要用&取位址,如果使用所指向位址中的值,還需要用到*。

5.引用比指針更安全:

因為引用不允許為空,定義時必須初始化,并且一旦指向一個變量,就不能被改變,是以比較安全;指針可以随時改變指向,并且可以不被初始化,或者為NULL,是以不安全。

野指針:多個指針指向一塊記憶體,free掉一個指針後,别的指針就成了野指針。

6.引用有類型檢查,指針沒有。

7.引用和指針作為函數參數傳遞時,引用是傳址,會改變原函數的值;指針是傳值,不會改變原函數的值。

引用和指針:類似”外号“和”職位“