参数传递
函数的参数分为形参和实参两种.形参(即形式参数)出现在函数定义中;实参(即实际参数)出现在主调函数中.函数调用时,主调函数把实参的值传送给被调函数的形参,从而实现主调函数向被调函数的数据传送.
⑴关于形参与实参的说明
①在定义函数中指定的形参,在未出现函数调用时,它们并不占内存中的存储单元.形参变量只有在被调用时才分配内存单元,在调用结束后,立即释放所分配的内存单元因此,形参只在函数内部才有效.
②实参可以是常量,变量,表达式,函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值(或地址),以便把这些值传送给形参.
③实参和形参在数量上,类型上,顺序上应严格一致,否则会发生"类型不匹配"的错误.对实参与形参数据类型不同时,应在带入实参时做相应的数据类型转换.而对于字符型与整型在有效的数据范围内可以互相通用.
④C语言规定,实参变量对形参变量的数据传递是"值传递",即单向传递.只能把实参的值传送给形参,而不能把形参的值反向地传送给实参.在内存中,实参单元与形参单元是不同的单元.
⑤在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参.调用结束后形参单元被释放,实参单元仍保留并维持原值.因此,在执行一个被调用函数时,形参的值如果发生改变,并不会影响主调函数的实参的值.
⑵参数传递的两种方式
①数值传递方式
特点:实参通过复制的方式传递给形参(实参和形参占用不同的内存空间).
数据复制方式就是把数据本身作为实参传递给形参,在传递时,有一个复制的动作,即将实际参数的值复制给形式参数.数值传递方式,如果形参的值发生改变,并不会影响实参的值.
②地址传递方式
特点:参数传递不是数据本身,而是数据的地址(实参和形参使用同一地址空间).
实参a
形参x
实参内存空间
形参内存空间
参数传递的例子:
地址传送方式是将数据的存储地址作为参数传递给形式参数,即要求形式参数的数据类型应是指针,对于实际参数来说其数据类型也要求是一个指针.指针类型存储的不是一个具体的数据,而是一个数据的地址.
在参数的传递中,实际上是把实参的地址传送给形参,两个参数共有同一个地址,指向同一个内存单元.所以在被调函数中可以直接对这个内存空间进行操作.当退出被调函数时,虽然形式参数立即随之消失,但其所作的各种操作已经影响了主调函数实际参数所指向存储空间的内容.
注意:由于按地址传递方式可以改变实参的值,因此,可以通过按地址传递方式来返回参数值.但同时要注意,必须确信实参值是要改变的,否则不能使用这种方式.