函数调用与函数参数
函数调用
创建 C 函数时,会定义函数做什么,然后通过调用函数来完成已定义的任务。
当程序调用函数时,程序控制权会转移给被调用的函数。被调用的函数执行已定义的任务,当函数的返回语句被执行时,或到达函数的结束括号时,会把程序控制权交还给主程序。
调用函数时,传递所需参数,如果函数返回一个值,则可以存储返回值。
函数参数
如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数。
形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。
当调用函数时,有两种向函数传递参数的方式:
调用类型 |
描述 |
传值调用 |
该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数。 |
引用调用 |
通过指针传递方式,形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。 |
默认情况下,C 使用传值调用来传递参数。一般来说,这意味着函数内的代码不能改变用于调用函数的实际参数。
可变参数
C语言编程中会遇到一些参数个数可变的函数,例如printf()这个函数,它的定义是这样的:
int printf( const char* format, ...);
它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的,例如我们可以有以下不同的调用方法:
printf("%d",i); printf("%s",s); printf("the number is %d ,string is:%s", i, s);
可变参数列表是通过宏来实现的,这些宏定义在stdarg.h中,所以用到可变参数的程序应该包含这个头文件,它是标准库的一部分,这个头文件中声明了一个类型va_list和三个宏:va_start,va_arg和va_end:
void va_start( va_list arg_ptr, prev_param ); //初始化一个可变参数列表 type va_arg( va_list arg_ptr, type ); //获取下一个参数 void va_end( va_list arg_ptr ); //停止使用可变参数列表
例:
#include<stdarg.h> float average(int n_values,...) { va_list var_arg;//声明var_arg用于访问参数列表中未确定的部分 int count; float sum=0; va_start(var_arg,n_values);//初始化var_arg,初始化过程将var_arg变量设置成指向可变参赛数部分的第1个参数。 for(count=0;count<n_values;count+=1) { sum+=va_arg(va_arg,int); } va_end(var_arg); return sum/n_values }
注意:
可变参数必须从头到尾按照顺序逐个访问。
如果访问过程中想中途而止是可以的,但是一开始就想从中间访问参数是不行的。
参数裂变中的可变参数并没有原型,所以作为可变参数传递给函数的值都将执行缺省的参数类型提升。