C 引用的本質分析

2021-08-20 10:58:34 字數 1988 閱讀 6320

--事物的難度遠遠低於對事物的恐懼!

下邊來看看乙個老生常談的交換函式

#include using namespace std;

//引用方式

void swap1(int& a, int& b)    //注意:函式引數中的引用不需要初始化

//指標方式

void swap2(int* a, int* b)

int main(int argc, char const *argv)

編譯輸出如下,可以看到,兩個函式均正確的交換了變數值,從使用角度來說,引用更令人感到簡潔愉快。

下邊我們來看看特殊的引用

const引用

-c++中申明的const引用讓引用這個變數擁有唯讀屬性(注意是引用這個變數,不能通過引用這個變數修改記憶體空間的值,但是還是可以通過用來初始化引用的那個變數去修改)

-格式為:const type& name = value;

int a = 12;

const int& b = a;

int* p = (int*)&b;

// b = 0; //error, 引用b為唯讀變數

a = 23;

cout << a << endl;

*p = 34;

cout << a << endl;

編譯輸出如下:

-當用常量對const引用進行初始化時,c++編譯器會為常量分配空間,並把引用名作為這段空間的別名

#include using namespace std;

int main(int argc, char const *argv)

編譯輸出如下,可以看到,c++編譯器已經為value分配了記憶體空間,同時可以通過指標修改這段記憶體空間的內容:

結論:使用常量初始化const引用,生成的是乙個唯讀變數。

乙個問題:引用有自己的儲存空間嗎?

#include using namespace std;

struct tref

;int main(int argc, char const *argv)

編譯執行下上邊的**(我的g++為64為編譯器)

從輸出結果來看,引用的大小跟指標的大小一樣。

本質就是:引用在c++中的內部實現是乙個指標常量

注意:-c++編譯器在編譯過程中用指標常量作為引用的內部實現,因此引用所占用的記憶體空間大小與指標相同。

-從使用角度,引用只是乙個別名,c++為了實用性而隱藏了引用的儲存空間這一細節。

-函式不能返回區域性變數的引用(類似於返回區域性變數的指標)

引用的意義:可在大多數情況下代替指標,又能避免由於指標操作不當帶來的記憶體錯誤。

總結:-引用作為變數別名而存在大多數情況是為了代替指標

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

-引用在編譯器內部使用指標常量實現

-引用的最終本質為指標,占用的記憶體空間與指標大小相同

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

C 中引用的本質分析

引用是c 中心增加的內容,在c語言是沒有引用這一種用法的。那什麼是引用呢?大家都知道,我們定義變數的時候,其實是將變數名和記憶體空間關聯起來,變數名就是一段記憶體空間的別名。當我們使用引用的時候,例如int a b 其實就相當於a是b的別名,也就是說a和b都是指向同一段儲存空間的。那這麼做有什麼意義...

C 引用的本質

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

C 引用本質

b 50 mov eax,dword ptr b mov dword ptr eax 32h int d a lea eax,a mov dword ptr d eax d 60 mov eax,dword ptr d mov dword ptr eax 3ch 以上的 均來自具體的編譯器,怎麼樣,...