C 中的引用和指標的區別

2021-08-09 15:25:30 字數 1607 閱讀 5118

都是位址的概念,指標指向一塊記憶體,它的內容是所指記憶體的位址;引用是某塊記憶體的別名,可以說引用是更安全的指標。

int a=1;int

*p=&a;

int a=1;int &b=a;

上面定義了乙個整形變數和乙個指標變數p,該指標變數指向a的儲存單元,即p的值是a儲存單元的位址。

而下面2句定義了乙個整形變數a和這個整形a的引用b,事實上a和b是同乙個東西,在記憶體占有同乙個儲存單元。

(2)引用不可以為空,當被建立的時候,必須初始化,而指標可以是空值,可以在任何時候被初始化。

(3)可以有const指標,但是沒有const引用。

(4)指標可以有多級,但是引用只能是一級(int **p;合法 而 int &&a是不合法的)。

(5)指標的值在初始化後可以改變,即指向其它的儲存單元,而引用在進行初始化後就不會再改變了。

(6)」sizeof引用」得到的是所指向的變數(物件)的大小,而」sizeof指標」得到的是指標本身的大小。

(7)引用使用時無需解引用(*),指標需要解引用。

(8)指標和引用的自增(++)運算意義不一樣。

(9)如果返回動態記憶體分配的物件或者記憶體,必須使用指標,引用可能引起記憶體洩漏。

例1:

void fun(int* b)//用指標做形參

}void fun(int* &b)//用引用做形參

}

如果在main函式中定義了乙個int型的空指標並分別作為實參傳入,如下:

int main()

cout

<< "/n";

return

0;}

結果用指標的函式會出現記憶體訪問出錯,用引用的函式則執行正常並正確輸出1 2 3。

這是因為:

(1)指標雖然是位址傳遞,但實際上也是在函式中又定義了乙個新的指標讓其與傳入的指標指向同一位址。但兩個指標本身作為變數在記憶體中的存放位址是不同的,就是說這是兩個不同的變數,只是內容(即所指位址)相同。

(2)在函式中對新定義的指標動態申請記憶體,但是當函式結束後,申請的記憶體的生命週期也就結束了,所以當回到主函式時,作為實參的指標位址和內容都沒有變化。仍然是個空指標,對其進行訪問自然出現了記憶體讀錯誤了。

假如在main函式中這樣寫:

int

*a = (int

*)malloc(sizeof(int)*3);

就不會出現記憶體讀錯誤了,但是輸出結果還是錯誤的,道理也是一樣的。

(3)用引用作為實參傳入時,fun函式中的b其實就是主函式中a的別名(或者叫外號),反正就是操作完全相同,位址相同,內容相同的乙個變數,所以當fun函式返回時,對b的操作在主函式中對a同樣有效。

例2:

int *a = null;

char* b = (char*)a;

int *a = null;

char* &b = (char*)a;

這一次是在編譯階段的區別:

用指標可以通過編譯,而用引用則不可以,提示型別轉換出錯。

通過這兩個例子可以看出,指標比引用靈活,也更加危險。

參考:

C 中引用和指標的區別

1 引用是直接引用,指標是間接引用 假如我們宣告並初始化變數a int a 1 那麼記憶體中就肯定有乙個地方的值變為了1,而且以名字a來引用。如果這時候我們在定義乙個引用int b a 那麼這塊記憶體區域就多了乙個名字b,我們引用名字b同樣是引用名字a。因為引用只是為某一記憶體空間取乙個別名,所以引...

c 中引用和指標的區別

c 中引用和指標的區別 1.引用沒有自身的記憶體空間,指標有 引用是已經存在的變數的別名,他所指向的記憶體即原來變數的記憶體。指標有自己的記憶體,在32位作業系統下,為4個位元組 也就是說,sizeof 引用 的值為引用所指變數記憶體空間大小,sizeof 指標 等於4 2.引用必須初始化,指標不用...

C 中引用和指標的區別

下面用通俗易懂的話來概述一下 其次,引用不可以改變指向,對乙個物件 至死不渝 但是指標可以改變指向,而指向其它物件。說明 雖然引用不可以改變指向,但是可以改變初始化物件的內容。例如就 操作而言,對引用的操作直接反應到所指向的物件,而不是改變指向 而對指標的操作,會使指標指向下乙個物件,而不是改變所指...