创建3个函数的值传递分别采用按值传递、地址传递和引用传递的方式将主函数的值传递中给出的两个整数进行交换。

安全检查中...
请打开浏览器的javascript,然后刷新浏览器
< 浏览器安全检查中...
还剩 5 秒&相关文章推荐
深入理解C语言的函数调用过程
本文主要从进程栈空间的层面复习一下C语言中函数调用的具体过程,以加深对一些基础知识的理解。
先看一个最简单的程序:
一、地址空间与物理内存
(1)地址空间与物理内存是两个完全不同的概念,真正的代码及数据都存在物理内存中。
物理储存器是指实际存在的具体储存器芯片,CPU在操纵物理储存器的时候都把他们当做内存来对待...
初学C语言的时候,我们有时会听说函数调用会有一定的开销,在进行了进一步学习之后,我们来看看原来听说的开销指的什么。
下面是两个非常简单的样例,就不作解释了:
函数调用版本C程序:#include ...
C语言值传递 地址传递 引用传递:
void Exchg1(int x, int y)
调用:把实参的值赋给形参
1、传值调用 先把实参的值复制一份,把复制后的实参的副本赋给形参,之后形参如何变化与实参无关。
2、引用调用 把实参(int a)的地址(&a)赋给形参(指针变量...
C语言函数调用三种方式:传值调用,引用调用和传地址调用
在C中,函数先定义,后使用。举个简单的例子
/************************
add by oscar999
***********************...
从C语言函数调用发现程序运行的秘密
本文使用一个简单的C语言的例子探索一下函数的调用机制,函数调用关系如下:int g(int x)
return x + 10;
}int f(int x)
return g(x...
本文主要从进程栈空间的层面复习一下C语言中函数调用的具体过程,以加深对一些基础知识的理解。
先看一个最简单的程序:
点击(此处)折叠或打开
/*test.c*/
...
他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)援引《C++ Primer(Fifth Edition)》6.2节
As with any other variable, the type of a parameter determines the interaction between the parameter and its argument. If the parameter is a reference (§ 2.3.1, p. 50), then the parameter is bound to its argument. Otherwise, the argument’s value is copied.
When a parameter is a reference, we say that its corresponding argument is “passed by reference” or that the function is “called by reference.” As with any other reference, a reference parameter is an alias for the object
that is, the parameter is an alias for its corresponding argument.
When the argument value is copied, the parameter and argument are independent objects. We say such arguments are “passed by value” or alternatively that the function is “called by value.”
Pointers (§ 2.3.2, p. 52) behave like any other nonreference type. When we copy a pointer, the value of the pointer is copied. After the copy, the two pointers are distinct.
大意如下:
正如其他的普通的变量一样,形参的类型决定了形参与实参的结合方式。如果一个形参是引用类型,那么这个形参被绑定到实参上,成为实参的别名;如果形参不是一个引用类型,那么实参的值将被拷贝并赋予形参。
当一个形参是一个引用类型,我们说它对应的实参被“引用传递”或者说当前函数被“引用调用”。正如普通的引用一样,一个引用形参是其所绑定的实参的别名。
当一个实参被拷贝并赋予形参,形参与实参便从此分道扬镳,成为无关的两个对象。我们说这样的实参被“值传递”或者说当前的函数被“值调用”。
指针形参的行为和任何非引用类型一致。当我们拷贝一个指针,实际上是指针中所存储的地址值被拷贝。拷贝后,两个指针再无瓜葛,成为两枚独立的指针。
综合上述,题干中所谓的地址传递就是形参为指针的传递方式。因为它的形参和实参的结合是以拷贝地址值为手段完成的,所以指针传递是值传递的一个子集。所以题干的说法应该是错误的。
官方已纠正
这题目真的是,,,,
这道题你会答吗?花几分钟告诉大家答案吧!
在距离适量路由选择协议中,水平...
扫描二维码,关注牛客网
下载牛客APP,随时随地刷题
浙ICP备号-2
扫一扫,把题目装进口袋ruby 函数到底是按值传递还是按引用 - Ruby - language - ITeye论坛
ruby 函数到底是按值传递还是按引用
& 上一页 1
锁定老帖子
精华帖 (0) :: 良好帖 (1) :: 新手帖 (3) :: 隐藏帖 (0)
等级: 初级会员
来自: 成都
发表时间:&&
相关知识库:
def pref1(agr)
agr.downcase!enda1 = 'HELLO'pref1(a1)puts "#{a1}" #输出 hellodef pref2(agr)
agr.downcaseenda2 = 'PREF2'pref2(a2)puts "#{a2}" #输出 PREF2def pref3(a,b)
a,b = b,aenda,b = 1,2pref3(a,b)puts a,b #输出 1,2def pref4(agr)
agr.replace('aaaaa')enda4 = 'a'pref4(a4)puts a4 #输出 aaaaa
ruby 函数到底是按值传递还是按引用???
等级: 初级会员
来自: 上海
发表时间:&&
ruby中没有什么值传递和引用传递的概念。在ruby中一切都是对象,而你向方法中传递的实质上是对象的引用( object-reference)。ruby中变量都是对象的引用。
def pref2(agr)
agr.downcaseenda2 = 'PREF2'pref2(a2)puts "#{a2}" #输出 PREF2
为什么调用了pref2后 a2还是大写的“PREF2”,看一下downcase的源码就不难发现问题了。
看到str=rb_str_dup(str); 这句其实真相大白了,实际上dwoncase返回的是一个新的字符串,并不是你原来传进去的字符串对象的引用了。
所以经过了pref2方法后,a2的值并没有发生改变。
def pref1(agr)
agr.downcase!enda1 = 'HELLO'pref1(a1)puts "#{a1}" #输出 hello
为什么经过了pref1方法a1的值发生了变化。还是先来看看downcase!的源码
查看源码后发现传入的对象引用自始至终未被更改过,所以最终返回的还是a1的引用,所以a1对象的内容在dwoncase!方法中被改变了。
太晚了,明日继续后两个
请登录后投票
等级: 初级会员
来自: 成都
发表时间:&&
@洛克刘膜拜大牛~
请登录后投票
等级: 初级会员
来自: 成都
发表时间:&&
洛克刘 写道
ruby中没有什么值传递和引用传递的概念。在ruby中一切都是对象,而你向方法中传递的实质上是对象的引用( object-reference)。ruby中变量都是对象的引用。
def pref2(agr)
agr.downcaseenda2 = 'PREF2'pref2(a2)puts "#{a2}" #输出 PREF2
为什么调用了pref2后 a2还是大写的“PREF2”,看一下downcase的源码就不难发现问题了。
看到str=rb_str_dup(str); 这句其实真相大白了,实际上dwoncase返回的是一个新的字符串,并不是你原来传进去的字符串对象的引用了。
所以经过了pref2方法后,a2的值并没有发生改变。
def pref1(agr)
agr.downcase!enda1 = 'HELLO'pref1(a1)puts "#{a1}" #输出 hello
为什么经过了pref1方法a1的值发生了变化。还是先来看看downcase!的源码
查看源码后发现传入的对象引用自始至终未被更改过,所以最终返回的还是a1的引用,所以a1对象的内容在dwoncase!方法中被改变了。
太晚了,明日继续后两个
等待中。。。。。。
请登录后投票
等级: 初级会员
来自: 上海
发表时间:&&
最后修改:
接下来继续看看
def pref3(a,b)
a,b = b,aenda,b = 1,2pref3(a,b)puts a,b #输出 1,2
为什么明明在pref3中交换了a,b结果为什么没变呢?这个问题确实比较难懂。我们可以把你的例子转换为一个更好理解的例子
def pref3(a) a = 5enda =1pref3(a)puts a #输出 1
明明把a传进去了,并给它赋值为5,为什么还是1呢?我们很自然的可以想到是不是外面的a和方法中的a不是同一个东西。为了验证,我们进一步改造我们的方法
def pref3(a)a = 5a.object_idenda =1a.object_id #输出3pref3(a) #输出11puts a
我们发现两个a的object_id不同,他们不是一个对象,而是两个。
现在我们明白了问题的关键,方法中的本地变量a指向了对象5,而外部的a仍旧指向的是对象1.
至此整个过程我们可以理解为:
有一个对象1,我们用a保存了他的引用。
然后我们将它的“引用的拷贝”传递给了方法pref3中的本地变量a,这时本地变量a保存了1对象的引用。
我们在pref3方法中创建了5对象,将其引用赋值给了本地变量a,这时a擦去了保存的1对象的引用,而改为保存5对象的引用
调用完pref3方法 ,其本地变量a随之消亡,对象5因为没有引用而随后被垃圾回收。
而外部的变量a自始至终保存着对象1的引用。
现在回头想想你的方法中传进去的a,b虽然交换了位置,但是对外部定义的a,b没有丝毫影响。因为他们根本保存的就是不同的对象的引用。
请登录后投票
等级: 初级会员
来自: 成都
发表时间:&&
" 至此整个过程我们可以理解为:&&&& 有一个对象1,我们用a保存了他的引用。&&&& 然后我们将它的“引用的拷贝”传递给了方法pref3中的本地变量a,这时本地变量a保存了1对象的引用。&&&& 我们在pref3方法中创建了5对象,将其引用赋值给了本地变量a,这时a擦去了保存的1对象的引用,而改为保存5对象的引用&&&& 调用完pref3方法 ,其本地变量a随之消亡,对象5因为没有引用而随后被垃圾回收。&&&& 而外部的变量a自始至终保存着对象1的引用。"很清析~~~太好啦~~~& 3Q~~~恩,这貌似在python里也是一样的~~恩,这里还一个作用域的问题~
请登录后投票
等级: 初级会员
来自: 嘉兴
发表时间:&&
最后修改:
ruby里全部都是指针吗? 我是来学习的。
请登录后投票
来自: 北京
发表时间:&&
ruby是传值啊
请登录后投票
发表时间:&&
最后修改:
在ruby里面对象分两类,对于可以在32 bit(其实没有32bit)中存得下的值,例如Fixnum,nil,true/false等,变量里面是存值的。对于其他对象,变量里面存的是指向对象的“句柄”。
ruby函数调用传递的是“值” - 净值(对于第一类),或句柄。
请登录后投票
等级: 初级会员
来自: 上海
发表时间:&&
最后修改:
Hooopo 写道
ruby是传值啊
ruby传递的是 引用的拷贝 并不是引用的本身。(其实就可以理解为值传递)
但对于基本类型是直接传递对象本身的。举个例子:
可以参考这个
“Fixnum objects have immediate value. This means that when they are assigned or passed as parameters, the actual object is passed, rather than a reference to that object. Assignment does not alias Fixnum objects. There is effectively only one Fixnum object instance for any given integer value, so, for example, you cannot add a singleton method to a Fixnum.“.
我觉得这篇文章能够结束这个话题了:
更有趣的讨论过程:
请登录后投票
& 上一页 1
跳转论坛:移动开发技术
Web前端技术
Java企业应用
编程语言技术

我要回帖

更多关于 函数的值传递 的文章

 

随机推荐