[問題] pass by value or reference?

作者: zzss2003 (brotherD)   2018-06-27 09:50:31
圖: https://imgur.com/a/s2OAcCl
第二個strcpy,我怎麼看都是pass by reference,怎麼書上說的是by value?
但書上又說,因為是by value,所以可以隨意改s跟t的值(想怎麼用就怎麼用)。這讓我聯
想到一個問題
如果擅自更改s跟t的值,下一次function call時傳進來的值會被改掉嗎?
比如第一次call function:
char * des;
char * src;
des = &arr1[0];
src = &arr2[0];
strcpy(src, des);
一開始的des與src都是指到arr1與arr2的頭,但跑完while後t跟s都已經指到arr1與arr2的
尾巴了,下一次再call strcpy的話,是不是又要重新assign一次? i.e.
des = &arr1[0];
src = &arr2[0];
ps: 請問t[i]assign給s[i]後,是s[i]跟'\0'做comparison嗎?
作者: sarafciel (Cattuz)   2018-06-27 10:00:00
你從char的角度看是是call by ref,char *的話就是call
作者: stupid0319 (徵女友)   2018-06-27 10:00:00
我怎麼看也都是pass by value
作者: sarafciel (Cattuz)   2018-06-27 10:01:00
by value沒有錯 外面的des跟src指到的東西會改 但是des跟src本身是call by value傳進去 所以不會變*才
作者: loveflames (咕啾咕啾魔法陣)   2018-06-27 10:27:00
答對了
作者: sarafciel (Cattuz)   2018-06-27 10:30:00
&des跟&src的(X) des跟src的value(O)你想傳&des跟&src的話 s跟t要宣告成char **
作者: loveflames (咕啾咕啾魔法陣)   2018-06-27 10:34:00
java的reference行為比較像C/C++的指標,以這角度來說是call by value,而C++ reference是真正意義的call
作者: sarafciel (Cattuz)   2018-06-27 10:35:00
改成這樣的話就會是你內文後段說的行為
作者: loveflames (咕啾咕啾魔法陣)   2018-06-27 10:35:00
by reference,不過底層實作也是用指標
作者: MOONRAKER (㊣牛鶴鰻毛人)   2018-06-27 11:43:00
看到參數前面有&才是pass by ref 而那是C++C是沒有pass by ref的
作者: tinlans ( )   2018-06-27 12:34:00
這類名詞只是 syntax sugar 層級上的詮釋,換句話說不那麼甜美還要多勞動你的就不會是 by ref。你看不清楚的話,先 typedef char *CharPtr,然後把全部的 char * 換成 CharPtr 就會懂了。指標型別,充其量也只是變數的一種型別,就只是這樣。在語言結構上,int 和 char * 都僅僅是一個型別而已。
作者: uranusjr (←這人是超級笨蛋)   2018-06-27 18:09:00
Java 的 reference 其實是個徹頭徹尾的 pointer, 根本不是理論意義上的參考, 一切都是個假象

Links booklink

Contact Us: admin [ a t ] ucptt.com