作者zzss2003 (brotherD)
看板C_and_CPP
标题[问题] pass by value or reference?
时间Wed Jun 27 09:50:31 2018
图:
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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1530064234.A.119.html
※ 编辑: zzss2003 (61.216.156.33), 06/27/2018 10:00:04
1F:→ sarafciel: 你从char的角度看是是call by ref,char *的话就是call 06/27 10:00
2F:→ stupid0319: 我怎麽看也都是pass by value 06/27 10:00
3F:→ sarafciel: by value没有错 外面的des跟src指到的东西会改 但是des 06/27 10:01
4F:→ sarafciel: 跟src本身是call by value传进去 所以不会变 06/27 10:02
5F:→ 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
6F:→ loveflames: 答对了 06/27 10:27
7F:→ sarafciel: &des跟&src的(X) des跟src的value(O) 06/27 10:30
8F:→ sarafciel: 你想传&des跟&src的话 s跟t要宣告成char ** 06/27 10:31
拍谢,打错了。是des与src的value,多打了&
9F:→ loveflames: java的reference行为比较像C/C++的指标,以这角度来说 06/27 10:34
10F:→ loveflames: 是call by value,而C++ reference是真正意义的call 06/27 10:35
11F:→ sarafciel: 改成这样的话就会是你内文後段说的行为 06/27 10:35
12F:→ loveflames: by reference,不过底层实作也是用指标 06/27 10:35
谢谢各位的建议,我想我要来复习一下by val与by ref的定义了
※ 编辑: zzss2003 (60.251.49.183), 06/27/2018 11:00:05
13F:→ MOONRAKER: 看到参数前面有&才是pass by ref 而那是C++ 06/27 11:43
14F:→ MOONRAKER: C是没有pass by ref的 06/27 11:44
15F:→ tinlans: 这类名词只是 syntax sugar 层级上的诠释, 06/27 12:34
16F:→ tinlans: 换句话说不那麽甜美还要多劳动你的就不会是 by ref。 06/27 12:34
17F:→ tinlans: 你看不清楚的话,先 typedef char *CharPtr, 06/27 12:37
18F:→ tinlans: 然後把全部的 char * 换成 CharPtr 就会懂了。 06/27 12:37
19F:→ tinlans: 指标型别,充其量也只是变数的一种型别,就只是这样。 06/27 12:39
20F:→ tinlans: 在语言结构上,int 和 char * 都仅仅是一个型别而已。 06/27 12:40
21F:→ uranusjr: Java 的 reference 其实是个彻头彻尾的 pointer, 根本不 06/27 18:09
22F:→ uranusjr: 是理论意义上的参考, 一切都是个假象 06/27 18:10