[問題] pass by value or reference?

看板C_and_CPP (C/C++)作者 (brotherD)時間7年前 (2018/06/27 09:50), 7年前編輯推噓0(0022)
留言22則, 6人參與, 7年前最新討論串1/1
圖: 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

06/27 10:00, 7年前 , 1F
你從char的角度看是是call by ref,char *的話就是call
06/27 10:00, 1F

06/27 10:00, 7年前 , 2F
我怎麼看也都是pass by value
06/27 10:00, 2F

06/27 10:01, 7年前 , 3F
by value沒有錯 外面的des跟src指到的東西會改 但是des
06/27 10:01, 3F

06/27 10:02, 7年前 , 4F
跟src本身是call by value傳進去 所以不會變
06/27 10:02, 4F

06/27 10:07, 7年前 , 5F
*才
06/27 10:07, 5F
所以s跟t是local variable?然後把&des跟&src的value copy一份過去給s與t? ※ 編輯: zzss2003 (61.216.156.33), 06/27/2018 10:26:12

06/27 10:27, 7年前 , 6F
答對了
06/27 10:27, 6F

06/27 10:30, 7年前 , 7F
&des跟&src的(X) des跟src的value(O)
06/27 10:30, 7F

06/27 10:31, 7年前 , 8F
你想傳&des跟&src的話 s跟t要宣告成char **
06/27 10:31, 8F
拍謝,打錯了。是des與src的value,多打了&

06/27 10:34, 7年前 , 9F
java的reference行為比較像C/C++的指標,以這角度來說
06/27 10:34, 9F

06/27 10:35, 7年前 , 10F
是call by value,而C++ reference是真正意義的call
06/27 10:35, 10F

06/27 10:35, 7年前 , 11F
改成這樣的話就會是你內文後段說的行為
06/27 10:35, 11F

06/27 10:35, 7年前 , 12F
by reference,不過底層實作也是用指標
06/27 10:35, 12F
謝謝各位的建議,我想我要來複習一下by val與by ref的定義了 ※ 編輯: zzss2003 (60.251.49.183), 06/27/2018 11:00:05

06/27 11:43, 7年前 , 13F
看到參數前面有&才是pass by ref 而那是C++
06/27 11:43, 13F

06/27 11:44, 7年前 , 14F
C是沒有pass by ref的
06/27 11:44, 14F

06/27 12:34, 7年前 , 15F
這類名詞只是 syntax sugar 層級上的詮釋,
06/27 12:34, 15F

06/27 12:34, 7年前 , 16F
換句話說不那麼甜美還要多勞動你的就不會是 by ref。
06/27 12:34, 16F

06/27 12:37, 7年前 , 17F
你看不清楚的話,先 typedef char *CharPtr,
06/27 12:37, 17F

06/27 12:37, 7年前 , 18F
然後把全部的 char * 換成 CharPtr 就會懂了。
06/27 12:37, 18F

06/27 12:39, 7年前 , 19F
指標型別,充其量也只是變數的一種型別,就只是這樣。
06/27 12:39, 19F

06/27 12:40, 7年前 , 20F
在語言結構上,int 和 char * 都僅僅是一個型別而已。
06/27 12:40, 20F

06/27 18:09, 7年前 , 21F
Java 的 reference 其實是個徹頭徹尾的 pointer, 根本不
06/27 18:09, 21F

06/27 18:10, 7年前 , 22F
是理論意義上的參考, 一切都是個假象
06/27 18:10, 22F
文章代碼(AID): #1RCkrg4P (C_and_CPP)
文章代碼(AID): #1RCkrg4P (C_and_CPP)