C语言关于函数传参和返回值的一些想法
关于函数中使用的参数,最近我有了一些新的认识,记录下来希望对大家有所帮助。
(1) 传参的过程其实就是使用赋值运算符“=”赋值的过程,所以对于复杂的结构体,例如数组,结构体,理论上是不支持直接传参的(新的编译器已经支持结构体直接参与传参,不过不推荐,效率低)。
(2)参数实际只有一种就是输入型参数,也就是参数是用来读的,而不是写的,因为写这个参数就污染了传参的数值,是不可逆的。而且就算是写参数也无法对函数外面的变量有所影响。
(3)传参只有一次,就是函数被调用的时候,在此之后函数体内部就是对参数的值进行操作。
(4)关于输入型参数和输出型参数的概念。这2个概念都是特指指针型变量,输入型参数意思是指针变量以及指针变量指向的变量,在函数体内部是被读操作的,而没有被写操作。输出型参数意思是指针变量经过一次传参后就只会被读而不会被写(与第二条对应),但是指针变量指向的变量是作为赋值运算符的左值被写的。也就是指针变量不会变,但是指针变量指向的变量可被写,这充分体现了运算符“ -> *”这2个指针相关运算符的作用域是全局的,也就是无论在函数内部还是函数外面,还是作为全局变量都会被个指向相关运算符“ -> *”操作。
(5)返回值返回的是一个数值,这个数值是作为赋值运算符的右值操作的。而且返回值返回也可以理解为一个数值传递的过程,只传递一次。
(6)函数体内部不要对参数变量进行写操作,如果需要改变参数中的值,需要在函数体内部建立临时栈变量,然后参数作为赋值运算符“=”的右值实现读操作,建立的栈变量的一份拷贝,然后操纵这个拷贝变量。
(7)参数变量实际是定义在函数对应栈内存中的,所以函数调用结束自动释放,释放后就无意义了,这也是参数变量是只读的,无法影响函数外部的原因。
(8)参数变量以及函数内部定义的栈内存只在函数内部起作用,但是指针相关变量,由于有全局作用域所以可以影响函数外面的变量的值。
(9)指针变量相关运算符“* ->”具有全局作用域,无论存储在哪里的变量都可以访问到。这里的访问指的是既可以作为赋值运算符的左值,也可以作为赋值运算符的右值,如果与运算符“* ->”共同作用的变量是参数,这个参数是只读的,原因为以上几点。