C 中引用的本質

2021-09-10 01:58:49 字數 2011 閱讀 8903

//引用的本質

結論一: 當常引用指向了不同型別的資料時,會產生臨時變數,即引用指向的並不是初始化時的那個變數

int age = 10;

const double &rage = age;

age = 30;

cout << "age is" << age << endl

cout << "rage is" << rage << endl

相等於int age = 10;

int temp = age;

const double &rage = temp;

age = 30;

彙編**:

mov dword ptr [ebp-0ch],0ah // 將10這個值賦值給age所指向的記憶體位址所對應的內容,ebp-0ch很明顯是age的記憶體位址

mov eax,dword ptr [ebp-0ch] // 將age中儲存的內容即10取出來,給了暫存器eax

mov dword ptr [ebp-24h],eax // 將暫存器eax中的10給了另外乙個區域性變數(匿名變數(看不見的變數))即temp,ebp-24h是匿名變數的記憶體位址

lea ecx, [ebp-24h] // 將匿名變數的值給了ecx,即將10給了ecx

mov dword ptr [ebp-18h], ecx // 將ecx中的10儲存到記憶體中的ebp-18h位址所對應的記憶體位址所對應的內容,即rage中,交給引用去指向

mov dword ptr [ebp-0ch], 1eh // 將age改掉,那麼temp是不會改變的,所以raage還是10,age值為30

結論二: 當常引用指向了相同型別的資料時,不會產生臨時變數,即引用指向了初始化時的那個變數

int age = 10;

const int &rage = age;

age = 30;

cout << "age is" << age << endl

cout << "rage is" << rage << endl

彙編**為

mov dword ptr [ebp-0ch],0ah //將10這個值賦值給了age記憶體所對應的內容

lea eax,[ebp-0ch] // 將age的位址值賦給暫存器

mov dword ptr [ebp-18h],eax // 將暫存器的h值賦值給引用rage,所以引用依然指向的age

mov dword ptr [ebp-0ch],1eh // 所以改變age的值,引用rage也會跟著改變,age = 10,rage也為10

陣列的引用有兩種寫法

第一種int array = ;

int &rarray[4] = array; // 表示這是乙個rarray的陣列,陣列中放著4個指向整型數的引用,這個是不對的,不能這麼寫

int (&rarray)[4] = array; // 定義了乙個引用rarray,這個引用是指向4個int型別的陣列

rarray[1] = 6;

第二種int array = ;

int *p = array;

int *(&p1) = array;// 用p1的引用去引用array,加乙個引用還是代表int *的意思,p1這個引用指向array,這裡會報錯,"int *&"型別的引用是非常量限定

也就是int *的引用來引用陣列array,既然是引用,就表示可以更改p1 = 100,這樣相等於要把100賦值給array,改引用的值就相等於改array,陣列名也就是陣列位址,陣列名是常量,不能更改,只能把引用變為常引用才能指向這個常量

// 一旦右邊是常量的話, 左邊應該是常引用

int * const &p2 = array; // 不能通過引用去改常量

所以常見的陣列引用有兩種寫法為

int array = ;

int (&ref1)[3] = array;

int * const &ref2 = array;

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 以上的 均來自具體的編譯器,怎麼樣,...