看板 C_and_CPP 關於我們 聯絡資訊
圖: 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嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.216.156.33 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1530064234.A.119.html ※ 編輯: zzss2003 (61.216.156.33), 06/27/2018 10:00:04
sarafciel: 你從char的角度看是是call by ref,char *的話就是call 06/27 10:00
stupid0319: 我怎麼看也都是pass by value 06/27 10:00
sarafciel: by value沒有錯 外面的des跟src指到的東西會改 但是des 06/27 10:01
sarafciel: 跟src本身是call by value傳進去 所以不會變 06/27 10:02
sarafciel: *才 06/27 10:07
所以s跟t是local variable?然後把&des跟&src的value copy一份過去給s與t? ※ 編輯: zzss2003 (61.216.156.33), 06/27/2018 10:26:12
loveflames: 答對了 06/27 10:27
sarafciel: &des跟&src的(X) des跟src的value(O) 06/27 10:30
sarafciel: 你想傳&des跟&src的話 s跟t要宣告成char ** 06/27 10:31
拍謝,打錯了。是des與src的value,多打了&
loveflames: java的reference行為比較像C/C++的指標,以這角度來說 06/27 10:34
loveflames: 是call by value,而C++ reference是真正意義的call 06/27 10:35
sarafciel: 改成這樣的話就會是你內文後段說的行為 06/27 10:35
loveflames: by reference,不過底層實作也是用指標 06/27 10:35
謝謝各位的建議,我想我要來複習一下by val與by ref的定義了 ※ 編輯: zzss2003 (60.251.49.183), 06/27/2018 11:00:05
MOONRAKER: 看到參數前面有&才是pass by ref 而那是C++ 06/27 11:43
MOONRAKER: C是沒有pass by ref的 06/27 11:44
tinlans: 這類名詞只是 syntax sugar 層級上的詮釋, 06/27 12:34
tinlans: 換句話說不那麼甜美還要多勞動你的就不會是 by ref。 06/27 12:34
tinlans: 你看不清楚的話,先 typedef char *CharPtr, 06/27 12:37
tinlans: 然後把全部的 char * 換成 CharPtr 就會懂了。 06/27 12:37
tinlans: 指標型別,充其量也只是變數的一種型別,就只是這樣。 06/27 12:39
tinlans: 在語言結構上,int 和 char * 都僅僅是一個型別而已。 06/27 12:40
uranusjr: Java 的 reference 其實是個徹頭徹尾的 pointer, 根本不 06/27 18:09
uranusjr: 是理論意義上的參考, 一切都是個假象 06/27 18:10