c语⾔函数传参详解
24.1.普通变量作为函数形参 (1)普通变量作为参数在函数传参时,形参和实参名字可以相同也可以不同,实际上都是⽤实参来替代相应的形参的。 (2)在字函数内部,形参的值等于实参。原因是函数调⽤时把实参的值赋值给了形参。这就是所谓的”传值调⽤”,相当于实参做右值,形参做左值。
24.2.数组和指针作为函数形参 (1)函数名作为形参传参时,实际传递是不是整个数组,⽽是数组的⾸元素的⾸地址。所以在⼦函数内部,传进来的数组名就等于是⼀个指向数组⾸元素⾸地址的指针。所以sizeof得到的是4。 (2)在⼦函数内传参得到的数组⾸元素⾸地址,和外⾯得到的数组⾸元素⾸地址是相同的。这就是所谓的”传址调⽤”,即调⽤⼦函数时传了地址,此时可通过传进去的地址访问实参。 (3)数组名作为函数形参时,[]⾥的数字可有可⽆。因为数组名做为形参传递的实际只是个指针,根本没有数组长度这个信息。 (4)指针作为函数形参时和数组作为函数形参是⼀样的.这就好像指针⽅式访问数组元素和数组⽅式访问数组元素的结果⼀样是⼀样的。
24.3.结构体变量作为函数形参 (1)结构体变量作为函数形参的时候,实际上和普通变量(类似于int之类的)传参时表现是⼀模⼀样的。所以说结构体变量其实也是普通变量⽽已。 (2)因为结构体⼀般都很⼤,所以如果直接⽤结构体变量进⾏传参,那么函数调⽤效率就会很低。(因为在函数传参的时候需要将实参赋值给形参,所以当传参的变量越⼤调⽤效率就会越低)。为提⾼效率,我们可改传变量的指针(地
址)进去。 (3)结构体因为⾃⾝太⼤,所以传参应该⽤指针来传(但是程序员可以⾃⼰决定,你⾮要传结构体变量过去C语⾔也是允许的,只是效率低了)。
24.4.传值调⽤与传址调⽤ (1)传值调⽤描述的是这样⼀种现象:x和y作为实参,⾃⼰并没有真⾝进⼊swap1函数内部,⽽只是拷贝了⼀份⾃⼰的副本(副本具有和⾃⼰⼀样的值,但是是不同的变量)进⼊⼦函数swap1,然后我们在⼦函数swap1中交换的实际是副本⽽不是x、y真⾝。所以在swap1内部确实是交换了,但是到外部的x和y根本没有受影响。 (2)在swap2中x和y真的被改变了(但是x和y真⾝还是没有进⼊swap2函数内,⽽是swap2函数内部跑出来把外⾯的x和y真⾝改了)。实际上实参x和y永远⽆法真⾝进⼊⼦函数内部(进去的只能是⼀份拷贝),但是在swap2我们把x和y的地址传进去给⼦函数了,于是乎在⼦函数内可以通过指针解引⽤⽅式从函数内部访问到外部的x和y真⾝,从⽽改变x和y。 (3)结论:这个世界上根本没有传值和传址这两种⽅式,C语⾔本⾝函数调⽤时⼀直是传值的,只不过传的值可以是变量名,也可以是变量的指针。
24.5.函数形参和返回值 (1)函数名是⼀个符号,表⽰整个函数代码段的⾸地址,其实质是⼀个指针常量,所以在程序中使⽤到函数名时都是当地址⽤的,表⽰调⽤该函数。函数体是函数的关键,由⼀对{}括起来,包含很多句代码,函数体就是函数实际做的⼯作。形参列表和返回值,形参是函数的输⼊部分,返回值是函数的输出部分。 (2)若没有形参列表和返回值,函数也能对数据进⾏加⼯,使⽤全局变量即可。⽤全局变量来传参和⽤函数参数列表返回值来传参各有特点,在实践中都有使⽤。总的来说,
结构体数组不能作为参数传递给函数
函数参数传参⽤得较多,因为这样可实现模块化编程,⽽C语⾔中也是尽量减少使⽤全局变量。 (3)全局变量传参最⼤的好处就是省略了函数传参的开销,所以效率要⾼⼀些;但是实战中⽤的最多的还是函数传参,如果参数很多传参开销⾮常⼤,通常的做法是把很多参数打包成⼀个结构体,然后传结构体变量指针进去。
24.6.函数传参中使⽤const指针 (1)const⽤来修饰指针作函数传参,就是为了声明在函数内部不会改变该指针所指向的变量。所以给该函数传⼀个不可改变的指针(譬如char *p = “linux”; 字符串常量,放在代码段中,不可改变)后,⼀旦该函数内部试图更改它时编译器会提⽰错误;⽽⼀个未声明为const指针参数的函数,我们给该函数传⼀个不可更改的指针时,⼀旦该函数内部更改它后,编译器在编译过程中不会有提⽰,⽽是会在运⾏中导致段错误。 (2)⼀般来说,函数的输⼊部分就是函数参数,输出部分就是返回值。问题是函数的参数可以有很多个,⽽返回值只能有⼀个。则我们⽆法让⼀个函数返回多个值。 (3)现实编程中,⼀个函数需要返回多个值是⾮常普遍的,因此完全依赖于返回值是不靠谱的,通常的做法是⽤参数来做返回(在典型的linux风格函数中,返回值是不⽤来返回结果的,⽽是⽤来返回0或者负数⽤来表⽰程序执⾏结果是对还是错,是成功还是失败)。 (4)普遍做法,编程中函数的输⼊和输出都是靠函数参数的,返回值只是⽤来表⽰函数执⾏的结果是对(成功)还是错(失败)。如果这个参数是⽤来做输⼊的,就叫输⼊型参数;如果这个参数的⽬的是⽤来做输出的,就叫输出型参数。输出型参数就是⽤来让函数内部把数据输出到函数外部的。 (5)总结:函数传参如果传的
是普通变量(不是指针)那肯定是输⼊型参数;若该函数形参是指针变量并且加了const,那么就表⽰这个参数是⽤来做输⼊型参数的;若该函数形参是指针变量并且还没加const,那么就表⽰这个参数是⽤来做输出型参数的。譬如C库函数中strcpy函数:char *strcpy(char *dest, const char *src);。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。