本词条由“科普中国”科学百科词条编写与应用工作项目 审核 。 简介 在调用有参函数时,主调函数和被调函数之间有数据传递关系。在主调函数中调用一个函数时,函数名后面括号中的参数称为“实际参数”(简称“实参”)。 实参可以是常量、变量或表达式, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。 数据传递 在调用函数过程中,系统会把实参的值传递给被调用函数的形参。或者说,形参从实参得到一个值。该值在函数调用期间有效,可以参加该函数中的运算。 在调用函数过程中发生的实参与形参间的数据传递,常称为“虚实结合”。 [1] 函数调用过程 1、函数的形参列于函数声明中,在函数定义的函数体内使用。在未出现函数调用时,形参不占内存中的存储单元;当函数调用时,形参(任何种类的)是一类将被填充的空白或是占位符。 2、将实参的值传递给形参。当函数被调用时,实参列在函数名后面的括号里。执行函数调用时,实参被传递给形参。 3、在执行函数期间,由于形参已经有值,可以利用其进行相关运算。 4、通过return语句将函数值带回到主调函数。 5、调用结束,形参单元被释放。实参单元仍保留并维持原值(值传递)。 [1] 传递机制对比 函数参数值传递 在值传递过程中,被调函数的形式参数作为被调函数的局部变量在栈中分配内存空间,主调函数的实际参数的值被复制并存入该内存空间,形成实际参数的一个副本。 值传递的特点是,被调函数对形式参数的任何操作都不会影响主调函数中的实际参数变量。 [2] 函数参数地址传递 在地址传递过程中,被调函数的形式参数仍然在被调函数的栈中分配内存空间,但此时是将主调函数实际参数的地址存入该内存空间。被调函数对形式参数的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。 地址传递的特点是,被调函数对形式参数的操作都影响主调函数中的实参变量。 [2] 函数参数引用传递 在引用传递过程中,被调函数的形式参数是对主调函数中实际参数的引用(C++引用,别名),形式参数和实际参数对应相同的内存空间。被调函数对形式参数进行操作,就相当于对实际参数进行操作。 [2]