引用和傳址的區別?
實參(被調)、行參(主調)
函數調用中發生的數據傳送是單向的。即只能把實參的值傳送給形參,而不能把形參的值反向地傳送給實參。 因此在函數調用過程中,形參的值發生改變,而實參中的值不會變化。
--傳值:
是把實參的值賦值給行參,相當于復制一塊同樣的空間那么對行參的修改,不會影響實參的值
--傳地址:
是傳值的一種特殊方式,只是他傳遞的是地址,不是普通的如int那么傳地址以后,實參和行參都指向同一個對象--傳引用:
真正的以地址的方式傳遞參數
傳遞以后,行參和實參都是同一個對象,只是他們名字不同而已對行參的修改將影響實參的值
即傳址時只需在函數調用時在參數的前面加上"&"號即可。將函數外部的值的內存地址傳遞給內部的參數,在函數內部的所有操作都會改變函數外部參數的值。
值傳遞(passl-by-value): 壓棧的是參數的副本。任何的修改是在副本上作用,沒有作用在原來的變量上。
過程中:被調函數的形式參數作為被調函數的局部變量處理,即在堆棧中開辟了內存空間以存放由主調函數放進來的實參的值,從而成為了實參的一個副本。值傳遞的特點是被調函數對形式參數的任何操作都是作為局部變量進行,不會影響主調函數的實參變量的值。
傳指針(pointer): 壓棧的是指針變量的副本。當你對指針解指針操作時,其值是指向原來的那個變量,所以對原來變量操作。
引用傳遞(pass-by-reference):壓棧的是引用的副本。由于引用是指向某個變量的,對引用的操作其實就是對他指向的變量的操作。
過程中:被調函數的形式參數雖然也作為局部變量在堆棧中開辟了內存空間,但是這時存放的是由主調函數放進來的實參變量的地址。被調函數對形參的任何操作都被處理成間接尋址,即通過堆棧中存放的地址訪問主調函數中的實參變量。正因為如此,被調函數對形參做的任何操作都影響了主調函數中的實參變量。
所謂值傳遞,就是說僅將對象的值傳遞給目標對象,就相當于copy;系統將為目標對象重新開辟一個完全相同的內存空間。
所謂引用,就是說將對象在內存中的地址傳遞給目標對象,就相當于使目標對象和原始對象對應同一個內存存儲空間。如果對目標對象進行修改,內存中的數據也會改變。