“形参的改变不影响实参”这句话说起来轻巧,但是要完全理解,似乎还有几个玄机。
在我发表《函数的定义》一文后,有朋友发表意见,提到了“函数调用过程中的入栈与出栈”,在此首先作个说明:我读的是《C++ Primer》,而不是《编译原理》,入栈与出栈不归我讨论。在现在讨论的尺度内,我们可以这么认为:形参是函数内部的一个局部变量,该局部变量在函数开始执行时被初始化,而初始化它的值则来自实参的值。也就是说,它的定义与初始化类似于“int i=3;”。只是被分成两行写了,形参的定义写在函数的定义中,如:“int ttt(int b)”,初始化写在了调用中“cout << ttt(a) << endl;”。——参看上一篇文章《形参与实参概念》。
那么,在函数中无论怎样改动b的值,被改的始终是形参这个局部变量,函数结束时,离开这个局部变量的作用域,变量被释放。
但是,C语言的“指针传递”总是给人“形参能改变实参”的感觉,其实这是一个误解。对于指针传递来说,函数的形参是一个指针,传给它的实参也应该是指针(或者能转为指针的值,比如数组名、能转换为指针的类等)。在函数中,如果改变了该指针(对指针的改变就等同于让这个指针指向别处),不会影响主调函数中的实参。但是,由于指针对应着一个内存地址,通过它可以改变内存的内容。所以,无论在函数内部的形参还是外部的实参,它们都可以影响同一内存的值。所以,指针传递可以把函数内部的影响带到函数外,但是,带到函数外的绝不是形参,而是形参所指的内存。
这就好比我把我家的钥匙给你配了一把,我手里的钥匙是实参,你手里的钥匙是形参。你无论是把钥匙折断还是磨短,都与我的钥匙无关,但是你用它开了我家的门却可以把我家洗劫一空。你影响的不是我的钥匙,而是我的财产。
上文说到,C++有了“引用传递”后,“形参的改变不影响实参”被判无效。这就得提到“引用传递”的概念了,下文再续。
本站文章皆为作者原创,其它媒体(包括但不限于报刊、杂志、网站、电视、电台)未经作者书面许可严禁转载(或部分摘录)!
