C 中引用的本質分析

2021-09-25 05:18:31 字數 1681 閱讀 5407

引用是c++中心增加的內容,在c語言是沒有引用這一種用法的。那什麼是引用呢?

大家都知道,我們定義變數的時候,其實是將變數名和記憶體空間關聯起來,變數名就是一段記憶體空間的別名。當我們使用引用的時候,例如int& a = b;其實就相當於a是b的別名,也就是說a和b都是指向同一段儲存空間的。那這麼做有什麼意義呢?

我們在c語言的時候,當要交換兩個變數的值時,很多都是使用指標來實現的,例如下面的**:

void

swap

(int* a,int* b)

當我們要呼叫該函式的時候,我們向該函式傳入的是位址,例如swap( &i , &j );

那如果我們在c++中用引用是怎麼實現的呢?其實只是將上面的**進行簡單的修改:

void

swap

(int& a,int& b)

對於這個函式的呼叫,我們就是之間傳入變數名就好了,例如:swap( i , j );。這樣相比於c語言中的傳入位址是不是比較直觀明了呢?相比於指標的方式更具有可讀性和實用性。

在c++中可以用const宣告引用,例如:const int& b = a;用這樣的引用會使得b在程式的執行過程中 無法對其進行複製運算,可以看下下面的**:

int a =5;

const int& b = a;

int* p =

(int*

)&b;

b =10

;// 錯誤,b具有唯讀屬性*p

=15;// 正確,此時a = b = *p = 15

a =20

;// 正確,此時a = b = *p = 20

也就是說上面的例子,我們無法通過b改變值,但是可以通過*p和a來改變。這個時候b具有唯讀的屬性。

當使用常量對const引用進行初始化的的時候,c++會為常量值分配儲存空間,並將引用名作為這段儲存空間的別名。

const int& b =1;

int* p =

(int*

)&b;

b =10

;// 錯誤,b具有唯讀屬性*p

=15;// 正確,此時b = *p = 15

使用常量對const引用進行初始化將會得到乙個唯讀變數。

引用在c++中的內部實現是乙個指標常量。例如:int& a,在內部中相當於int * const a

對於int a = 10;int& b = a;你如果看這兩條語句的彙編**你就會發現,對於int a = 10;c++編譯器是將10存進a所代表的儲存空間裡,對於int& b = a;是將a所代表的記憶體位址賦給b變數,這是不是跟我們的指標操作一樣?其實引用的本質就是指標。

從內部實現上看,c++編譯器在編譯的時候吧指標作為引用的內部實現,因此引用所占用的空間大小與指標相同。

從使用者的角度看,引用只是乙個別名,c++為了實用性而隱藏了引用就是指標這一本質。

引用作為變數別名而存在旨在代替指標,但引用的本質是指標

const引用可以使得變數具有唯讀屬性

引用可以盡可能的避開一些記憶體錯誤

C 引用的本質分析

事物的難度遠遠低於對事物的恐懼!下邊來看看乙個老生常談的交換函式 include using namespace std 引用方式 void swap1 int a,int b 注意 函式引數中的引用不需要初始化 指標方式 void swap2 int a,int b int main int ar...

C 中引用的本質

引用的本質 結論一 當常引用指向了不同型別的資料時,會產生臨時變數,即引用指向的並不是初始化時的那個變數 int age 10 const double rage age age 30 cout age is age endl cout rage is rage endl 相等於int age 10...

C 引用的本質

引用的意義 1 引用作為其他變數的別名而存在,因此在一些場合可以代替指標 2 引用相對於指標來說具有更好的可讀性和實用性 引用的本質 1 單獨定義普通引用時 必須初始化,說明很像乙個常量 includeusing namespace std 1 第一點 單獨定義普通引用時 必須初始化,說明很像乙個常...