天天看点

函数调用与函数参数

函数调用 

创建 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

}       

注意: