函數參數的不同和“誇張”的引用

函數的形參的可能性有,變量,指針,數組和引用。
先來看變量。
int fun(int a,int b)      例如此函數形參是兩個變量,它們的存儲地址和主調函數裏的實參是不同的,所以
{                            改變了形參的大小,並不會改變實參的大小。但爲什麼分配的內存不同,還可以把返回值帶回?
     int c;                這是因爲在return C時,這個值返還給了EAX,通過此寄存器將值給主調函數。由此可以看出,
   c=a+b;              其實並沒有影響或干預fun函數裏面變量的生存期。
 return c;              有的人或許會問,那我想通過調用函數改變主調函數的值怎麼辦啊?
}                         
                          這就談到了傳址調用。
                          什麼是傳址調用那?
                         就是形參是一個指針,他接受的是一個地址。當它是數組的時候,它退化成了一個指向數組首元素的地址的指針;指針就是指向實參的地址;在這裏
                       
                        要重點說說引用的作用。
                        引用的符號是&,那系統什麼時候認爲它是引用那?
                        當&符號在兩個變量之間時,系統就把它定義爲位運算符,當&符號在賦值運算符和一個變量或數組的中間時,就是取其地址,當&在一個類型名和一個變量中間   
                        時,就代表了引用。
                        引用代表什麼意思那?
                        就比如一個人叫林淺雪,她的小名叫小雪,引用就相當於她的別名,我們可以通過小雪找到她,也可以通過她的大名找到她。
                       當引用作爲形參時,編譯器就會將其變成,指針的形式,就相當於 (類型)*const 變量   形式。由此可以看出,它的指向不可以變,但是它指向的內容卻可以變。
                       
                        那引用有什麼限制?
                      1: 引用沒有二級,或者說三級。
                      2:引用在定義的時候必須初始化。
                    
可能有人會問,不是說引用在定義的時候必須初始化,那當引用是形參的時候不是就沒有初始化了嗎?
     6:  int *b=&a;
012D15F5  lea         eax,[a]
012D15F8  mov         dword ptr [b],eax
     7:  int &c=a;
012D15FB  lea         eax,[a]
012D15FE  mov         dword ptr [c],eax

如圖:是反彙編裏面對引用的處理,由此可以看出,編譯器把引用與指針做了一樣的處理。








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章