|
查看: 1073|回复: 13
|
C Language 的专家 来下
[复制链接]
|
|
|
我是中学学生,我想问:
C language 里的 Call by Value 跟 Call by reference 有什么分别?
老师说Call by reference太强了,所以不教。。。
但是我很想知道!!
请教教我 |
|
|
|
|
|
|
|
|
|
|
发表于 1-7-2008 02:15 PM
|
显示全部楼层
那是c++和c不一樣的地方
有call by reference
call by reference能改变实际参数的参考地址。
Ex:
简单的类是call by value,例如:String, Integer, Boolean, BigInteger, Float, Double等等吧,复杂的类都是call by reference。
OOP 的程式語言,對於 "物件型別" 和 "參考型別" 有著不同的解釋 .
對於數值型別來說,會有 call by value 或 call by reference 之分,而要做到 call by reference,就要用 "ref" 來標示 .
但對於物件型別來說,都是以 call by reference 為主,這也是為什麼寫程式時經常會出現 "物件參考並未設定為物件的執行個體" 的原因,但物件型別也可以用 "ref" 來特別的指示用 call by reference.
这网站可以 看:http://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_value
[ 本帖最后由 kelvinteo 于 1-7-2008 02:17 PM 编辑 ] |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 1-7-2008 02:22 PM
|
显示全部楼层
原帖由 kelvinteo 于 1-7-2008 02:15 PM 发表 
那是c++和c不一樣的地方
有call by reference
call by reference能改变实际参数的参考地址。
Ex:
简单的类是call by value,例如:String, Integer, Boolean, BigInteger, Float, Double等等 ...
你能写一个很简单的C Language Coding 给我看吗?
[ 本帖最后由 地域护神者 于 1-7-2008 03:03 PM 编辑 ] |
|
|
|
|
|
|
|
|
|
|
发表于 1-7-2008 07:24 PM
|
显示全部楼层
|
一個 是 丟 variable 的 value , 一個是 丟 variable 的 地址。。。 不就這樣咯。。 |
|
|
|
|
|
|
|
|
|
|
发表于 2-7-2008 12:30 AM
|
显示全部楼层
call by reference太强?是他不会,没法子教吧?call by reference 是 C 里面的一个基本中的基本的功能!
你这老师真的太强了!! |
|
|
|
|
|
|
|
|
|
|
发表于 2-7-2008 01:09 AM
|
显示全部楼层
你的老师...-_-"
我想网上有例子吧....可以找找....很容易分辨的... |
|
|
|
|
|
|
|
|
|
|
发表于 2-7-2008 03:02 AM
|
显示全部楼层
让我试试看解释call by value 和call by reference。。。
一间课室里(program),有3个人(variables),分别名为小明,小强和大雄。他们是你的朋友。你分别把5块钱交给小明,10块钱交给小强,15块钱交给大雄。你和他们约定,当你需要钱时,他们必须马上把钱交回给你。而这钱就是你储存在program里的data(value)。
当你呼叫小明时,他就会上前,把5块钱交给你。这是call by value。
大雄坐在第二排第三行。这个位子我们就根据所有的位置有多少牌,多少行,把大雄的位置赋予一个编号(地址),也就是(打个比方):0203。
然后,老师(function)说要收杂费15块,可是现在你在忙着,不得空直接去跟他们拿钱,你告诉老师,你去0203也就是第二排第三行(reference,address, or pointer)的那位同学那里拿吧,我的钱在他那儿。这就是call by reference。
这样你明白吗?
[ 本帖最后由 geekman 于 2-7-2008 03:04 AM 编辑 ] |
|
|
|
|
|
|
|
|
|
|
发表于 2-7-2008 08:32 AM
|
显示全部楼层
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 2-7-2008 09:33 AM
|
显示全部楼层
原帖由 geekman 于 2-7-2008 03:02 AM 发表 
让我试试看解释call by value 和call by reference。。。
一间课室里(program),有3个人(variables),分别名为小明,小强和大雄。他们是你的朋友。你分别把5块钱交给小明,10块钱交给小强,15块钱交给大雄。你 ...
哦,明白了, 那么我可以在那个website可以学到 Coding??? |
|
|
|
|
|
|
|
|
|
|
发表于 2-7-2008 09:43 AM
|
显示全部楼层
回复 9# 地域护神者 的帖子
简单说,
call by value 就是将呼叫function 的 argument 拷贝去 called function 里, 在 called function 里 argument 更改不会影响 calling function 的argument
call by reference 的话, called function 的 variable 一改, calling function 的也跟着改。 |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 2-7-2008 10:52 AM
|
显示全部楼层
我还是想看Coding才能完全明白 |
|
|
|
|
|
|
|
|
|
|
发表于 2-7-2008 11:42 AM
|
显示全部楼层
回复 9# 地域护神者 的帖子
website我也不大清楚,很多人都建议cplusplus.com,不过我没去过这个网站,所以不知道好不好,另一个我常去的网站是www.gamedev.net,不过这个网站比较集中在游戏开发的技术讨论,如果新手去问问题,还是有不少人愿意帮忙的(不管和游戏编程有没有关系),只是如果是去问功课的答案的会被公干得很惨。。。 |
|
|
|
|
|
|
|
|
|
|
发表于 2-7-2008 12:24 PM
|
显示全部楼层
call by value:- void main(void)
- {
- int a, b;
- int sum;
- a = 44;
- b = 17;
- sum = get_sum(a, b);
- }
- //----------------------------------
- int get_sum(int value1, int value2)
- {
- return (value1 + value2);
- }
- //---------------------------------
复制代码 在上面的例子中,你直接使用你的 variables(也就是 a 和 b ),在你呼叫 function get_sum(int, int) 时 a 和 b 的数值(44,17)会被推进 stack 里面(stack 是个记忆暂存区,给 functions 交换 data 用的),当 get_sum() 被启动时它看到自己的 prototype/declare 里面有两个 int 的 argument(int value1, int value2),所以它知道在 stack 里面有两个属于它的 integer,它就会去 stack 那里把两个 integer 抽出来。他得到的就是两个数目字 (44, 17)。无论它怎么改这两个数字,都不会影响 a 和 b 本身的内容,因为它得到的只是 a 和 b 的 value,而不是 a 和 b 本身。这就是 call by value。
再看另一个例子:- void main(void)
- {
- int a, b, c;
- a = 44;
- b = 17;
- get_sum(a, b, &c)
- }
- //----------------------------
- void get_sum(int value1, int value2, int *ref)
- {
- int sum;
- sum = value1 + value 2;
- (*ref) = sum;
- }
- //----------------------------
复制代码 以上的例子使用的就是 call by reference。a 和 b 依然是 call by value, 和第一个例子一样。而 c 则是依其在记忆体里面的地址来传给get_sum()。&c 就是告诉 function,被推进 stack 的是一个pointer,也就是记忆体地址,而这个地址代表的是一个 integer 的储存空间。由于 c 是 passed by reference,也就是说 get_sum() 知道 c 的实际所在地点,所以它可以直接使用或更改 c 的数值,而 (*ref)= sum (ref 是 c 的地址)里面的那个 * 就是代表 “直接修改或使用那个地址里面的数值" 的意思,和 pointer 是两回事,要注意。这情形就好像当一个恶霸知道你家的地址后,他可以随时随地去你家把你 x,xx 兼 xxx 一般,要你圆要你扁,随心所欲 ,这就是 call by reference。
免责声明:由于我已经很多年没用这些东西,那个(*ref) = sum 很可能有些记忆模糊的地方而写错,自己看着办吧。。。 |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 2-7-2008 01:03 PM
|
显示全部楼层
回复 13# geekman 的帖子
我好多谢你啊! |
|
|
|
|
|
|
|
|
| |
本周最热论坛帖子
|