C 中的指標和引用

2021-10-18 02:04:16 字數 2961 閱讀 6496

比較位址和引用

由於c++比較底層,能直接操作到記憶體,同時c++又可以進行物件導向的程式設計。因此c++中的「指標(pointer)」和「引用(reference)」這兩個概念都比較重要。先對幾個基本概念進行複習。

程式中最常見的可以說就是用=進行的賦值操作。而針對賦值操作,就有了左值和右值的概念:

int a = 100,表示將100這個右值,儲存在了變數a所表示的佔據4個位元組的int型別的記憶體位置;而int b = a中,變數a為右值,變數b為左值。因此是取變數a所對應的具體數值,儲存在變數b表示的int型別的記憶體位置。總而言之,c++中乙個變數的名字,實際上對應了記憶體位置具體數值兩個內容。如下圖:

一直以來就對c++中*&這種比較「非人類」的標記比較頭疼,在這裡再把這些符號再複習一遍,同時鞏固一下對應的概念。

首先一定要區分這兩個符號用在左值和右值上的區別:

上述三種用法可以用下圖總結:

但c++中還有乙個特性就是引用。將&用在左值上,如在定義乙個變數時加上&,則表示定義的是乙個引用變數。引用變數必須要在定義的時候就初始化,使得該變數一開始就指向某個具體變數。實際上定義乙個引用變數,就相當於將乙個原有變數所對應的位址和數值新增了乙個名稱:

如上圖,定義指向a的引用ref,實際上就相當於在變數a對應的位址和數值上增加了乙個名稱。因此之後無論是修改a還是修改ref,對應位址上的數值均會發生改變:

在使用*定義指標,或&定義引用時,符號靠近型別還是靠近變數名都是可以的,如下面兩句都是合法的:

int a =

100;

int* ptr1 =

&a;int

*ptr2 =

&a;

但一定注意在一行定義多個變數時,每個變數名前是否加上符號,才代表該變數是否是指標或引用。如int *p, i,很明顯p為整數指標,i為整數,即相當於int *p; int i;;而若寫作int* p, i,仍然是p為整數指標,i為整數!若想要同時定義多個指標,應該使用int *a, *b, *c

最後,比較一下位址和引用的一些差別。首先按下圖定義各種變數:

即分別定義並初始化了整數變數ab,二者明顯對應的是不同位址的不同數值。之後int &ref = a定義了乙個指向a的引用,即將a對應的記憶體和數值新增了乙個名稱ref。最後int *pt = &a,定義了乙個指向a的指標pt。與引用ref不同,指標pt實際上占用了一塊記憶體,只是這塊記憶體儲存的值是變數a對應的記憶體位址。因此對該指標解引用*pt實際上也就對應變數a,作為左值時表示對變數a重新賦值,作為右值時表示取變數a對應的值。

之後重新賦值引用ref = b

由於引用ref、變數a和指標的解引用*pt實際上指向同一位址,因此這些變數的值都會因此而改變。不過此時變數a只是在數值上與變數b相同,二者仍然佔據了不同的記憶體。

之後重新賦值變數b

如上所述,變數a與變數b二者仍然佔據了不同的記憶體,因此重新賦值變數b也並不會影響到變數a,以及指向變數a的引用ref和指標pt

最後重新賦值指標pt

可見將之前指向a的指標修改為指向b,實際上也就是修改了指標變數pt對應的具體數值為變數b對應的位址。

總而言之,引用與指標的主要區別總結為如下幾點:

C 中的指標和引用

注意本人的部落格都遷移到本人自己搭建的部落格位址,通過此處可檢視。本人在工作之餘學習c 但是可能在訓練過程種,會通過各種刷題的形式去提公升自己,但是這樣在一些公司 尤其是大廠 面試的時候會很尷尬。而c 種的指標和引用有什麼區別和聯絡呢,現在就來說道說道,如有錯誤,敬請大家指正。首先我們來說道說道指標...

c 中的指標和引用

首先 指標是儲存的變數的位址,引用是變數的別名,這個必須記住 單純的給變數取別名沒有任何的意義,作為引數傳遞,能保證引數傳遞過程中不產生任何的副本 引用可以直接操作變數,但指標的話必須通過 p 間接的操作變數,指標可讀性行比較低 引用必須要有初始值 int a 常量必須要有初始值 const int...

C 中的指標和引用

文章中舉了大量的例子,希望讀者可以耐住性子好好讀一下,相信會對指標和引用有底層的了解。1.指標 2.作用 1.宣告指標變數 2.表示指向 取出對應的普通型變數的值 3.舉例 例項一 includeusing namespace std int main 控制台輸出結果 指標變數point的值 0x6...