小品 關於 C 引用

2021-04-08 21:37:46 字數 1842 閱讀 5384

此文緣起我看了這篇文章:

還記得當年讀書時, 牛牛的c++老師告訴我: "引用, 其實就是別名, 與其所引用的物件完全等價". 可是, 我還是有這點疑問: "等價的含義, 是指的什麼? 難道是說在最底層的實現上兩者直接就是使用的同乙個記憶體位置嗎? " 比如下面的這段**:

intmain()

...

經過彙編後, 變成了這樣:

main:

leal    4(

%esp), 

%ecx

andl    $-16

, %

esppushl    -4

(%

ecx)

pushl    

%ebp

movl    

%esp, 

%ebp

pushl    

%ecx

subl    $

16, 

%esp

.lcfi5:

movl    $

100, -16

(%

ebp)     

; ebp-16 為變數 a 的位址

leal    -16

(%

ebp), 

%eax

movl    

%eax, -12

(%

ebp)     

; 將a的位址放在 ebp-12 位址處

leal    -16

(%

ebp), 

%eax     

movl    

%eax, -8

(%

ebp)      

; ebp-8是指標c變數, 此句是給指標c賦值

movl    -12

(%

ebp), 

%eax     

; 給引用b賦值前, 先把存在 ebp-12 的 a 的位址取到eax中

movl    $

99, (

%eax)         

; b = 99

movl    $

88, -16

(%

ebp)

movl    -12

(%

ebp), 

%eax     

; 此處給引用b的賦值, 與前面一樣, 也是先取a的位址

movl    $

77, (

%eax)

movl    -8

(%

ebp), 

%eax       ; 給*c賦值前, 先取c位址

movl    $

66, (

%eax)          ; 此處執行 *c = 66

movl    $0, 

%eax

addl    $

16, 

%esp

popl    

%ecx

popl    

%ebp

leal    -4

(%

ecx), 

%esp

ret

由此可見, 引用, 在具體實現時, 會申請乙個臨時空間(棧內空間), 目的是存放被引用物件的位址. 當使用引用變數時, 其實就是對被引用物件作了一次間接定址. 而從彙編**中來看, *c 確實與 b 在使用時的彙編**一樣, 都是先取位址, 再將值存入此位址. 所不同的, 只是在c++層面, 作為如 b 這樣的引用型別變數, 只可在初始化時賦值, 且只能賦值一次.

關於C 的引用

c 的實現是建立在c的基礎上的,c 是c的超集,也就是c的補充以及擴充套件 所以叫c 也可以理解為c 是裝了裝備的c。c 的引用其實就是c的指標的變形,兩者可以相互替代。下面先貼一段c 的 include using namespace std void fgd int e intmain 輸出結果...

C 新手 關於引用遍歷

給定的object類會通過ref 儲存對其他任意object物件的引用。findrefs函式,收集指定root物件所有直接或間接引用到的物件 包括root本身 並儲存到refs中。即找出a所有直接或間接的不重複引用關係元素!class object object類 std string name s...

關於C 中的引用

關於c 中的引用,它其實不是定義乙個新變數,而是給已經存在的變數取了乙個別名,這樣編譯器也就不會為變數開闢記憶體空間,它和它引用的變數共用同一塊記憶體空間.來看例子 include using namespace std int main 引用是給乙個變數起別名,兩個名字都是乙個變數,所以不論操作哪...