--事物的難度遠遠低於對事物的恐懼!
下邊來看看乙個老生常談的交換函式
#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 以上的 均來自具體的編譯器,怎麼樣,...