程序中的函数参数

程序中的函数参数

1、什么是函数

C语言程序的基本单位是函数。而函数就是若干个语句构成的块语句,用来单独解决一个问题。由函数名、函数参数、函数返回值和函数的执行语句组成。

​ 其中函数参数是可选的,可以是void,也可以是参数列表,如下所示:

函数类型 函数名称(参数1类型 参数1名称,参数2类型 参数2名称.........)

{

......

}

2、参数的选择

​ 如果函数的参数列表为void,表示没有传递的参数,此时如果在函数中需要用到参数,则需要在函数内部定义一个普通变量,或者定义一个全局变量或者静态局部变量。

​ 如果函数参数列表中有定义参数,那么要知道这个定义的参数只是一个函数的助记符, 只是为了描述需要传递给函数的参数,所以函数的参数一般称为形式参数,简称为形参。而定义函数的时候函数参数列表中的形参是不占内存的,只是为了提醒用户参数的数量和类型!

​ 当一个函数被调用之后,函数的形参才会得到对应的内存,并且函数的形参的内存只会在函数内部生效,当函数调用完成后,则函数形参的内存会被系统自动释放。

​ 所以在一个函数时就要考虑传入的参数只是一个数值还是传入一个地址,这个传递方式分别叫做单向传递和双向传递。

  • 单向传递:只是把实参的值传递给函数作为参数,在函数内部对数值进行修改是不会影响外部实参的!
  • 双向传递:把实惨的地址传递给函数作为参数,这样函数内部就可以对地址中的数据进行修改,则函数外部的实参地址下的值也会变化。

那么为什么单向传递不会对实惨进行修改,而双向传递会呢?

​ 首先,函数内定义的变量和函数参数都是局部变量,局部变量的内存在定义的时候由系统内核进行分配,在函数结束的时候内核也会自动释放内存。
当函数传入的是一个数值,内核会分配一块内存空间,把传入的值复制一份给它,函数内部则对这块新的内存空间进行操作,而不会对实际参数的那块内存改变。

​ 当函数传入的是一个实参的地址,则内核也会分配一块内存空间,复制一份参数的地址给他,相当于函数知道了实参的地址,函数中就可以通过 操作符( ***** )来间接访问实惨并操作地址下的值。当函数结束的,内核分配的用来存放地址的空间被释放,而实参对应的存储空间已经被操作,而且被调用的函数结束并不会使得实参的空间被释放,所以双向传递能对实参进行修改。

​ 在实际应用中,当已经定义了一个全局变量,值为0,若以它作为实参调用函数,函数就会用一个形参来接收它,而这个形参即使是与实参同名,他依然不是对之前的全局变量,而只是个形参,当函数结束时,形参的内存释放,全局变量的值不会改变,依然还是0,这也是我编写函数时把全局变量和形参混淆了,导致出现错误的结果,希望大家注意细节,避免类似的错误。

总结:当编写函数时,一定要考虑是否需要传参,和传入数值还是地址,这取决于你需不需要对传入的参数进行修改。如果不需要修改,则传入数值,如果需要修改,则可以传入实参的地址,或者使用全局变量,则不需要传参,当然,在使用全局变量时,也要考虑耦合性的问题,这些需要对特定问题特定解决,使用相对合适的方式

posted @ 2024-05-26 00:20  沉舟道人  阅读(32)  评论(0编辑  收藏  举报