class program將物件obja作為引數傳遞給函式testfun,這時傳遞的是物件obja的引用,所以在函式內對obja的修改會直接應用到這個物件本身。在函式testfun內修改了形參obj的name屬性,所以在main中再呼叫obja.name時這個屬性值就變為在testfun中修改後的值了。這一點很好理解,執行結果也就是:", obja.name));
testfun(obja);
console.writeline(string.format("in main:", obja.name));
console.read();
}static
void testfun(testclass obj)
", obj.name));
}public
class testclass}}
如果我們換一種寫法:
class program那結果又將如何呢? 在testfun中新建立了乙個物件objb,接著將obj指向新建立的物件objb並對其的name屬性賦值,所以在testfun函式體裡console.writeline的時候obj.name應該是「i am objb」。那在main裡呼叫了testfun(obja)後obja指向的物件到底做了改變沒有,它仍舊指向原來的物件還是已經指向了在testfun裡建立的objb呢?", obja.name));
testfun(obja);
console.writeline(string.format("in main:", obja.name));
console.read();
}static
void testfun(testclass obj)
", obj.name));
}public
class testclass}}
我的猜測是這樣的,將obja傳遞給testfun傳遞的實際是obja的位址,在呼叫testfun之前的對應關係是:
obja是個變數,他本身的位址是000001,它存放的是obja物件的位址00e001。當呼叫函式testfun(obja)時,由於要將obja作為引數傳遞給testfun,所以在
棧中就複製乙個obja位址的副本,這個副本的位址為000003,他存放的仍舊是obja物件的位址00e001,如圖:
所以在testfun函式中,一開始obj指向的還是obja物件。當在testfun中建立了乙個物件objb後,記憶體模型變為:
testfun中執行「obj=objb」後,obj指向objb物件,如下圖:
所以執行完testfun函式後,main函式中obja仍舊指向原來的obja物件,故執行結果如下:
注:本文中的記憶體模型僅是個人猜測,肯定有不正確或者不嚴謹的地方,希望不要誤導大家,也歡迎指正。
C語言關於函式傳遞引數的問題
二叉樹有左右結點之分,不存在度 2的結點 typedef struct node treenode,tree tree node型別 tree表示的是指向node這一結點的指標 所以對tree表示什麼一直不太理解 1.tree t中t是指標麼,如果是指標為什麼不加 號 2.為什麼tree不加 號代表...
java物件函式引數傳遞
class passparm public static void change int x 輸出x 5 主調函式沒有變化x 5 class passparm public static void change passparam obj 輸出x 3,兩個棧記憶體指向了乙個堆記憶體。change方法...
關於C語言傳遞引數的問題
要求 編寫乙個函式,將rgb資料顯示到tft彩屏上,rgb資料為565格式,平台 stm32f030 lcd st7735s 編譯平台 mdk5.14 對於這個一般的來說很多人會這麼寫 void lcd draw rgb u16 x,u16 y,u16 x size,u16 y size,u16 p...