0
点赞
收藏
分享

微信扫一扫

C语言 变参函数的使用


1.1简单介绍



在C语言中,不但参数的类型可变,参数的个数也是可变的.也就是说,在形参表中可以不明确指定传递参数的个数和类型,一个常见的库函数Printf()就是如此.这种函数称之为变参函数。可变长参数函数的参数数目和类型虽然是可变,但其设计原理与固定参数函数的设计原理是一致的,必须有办法告诉变参函数没有指定的参数的个数和类型。




1.2可变长参数函数的设计方法



在标准文件stdarg.h中包含带参数的宏定义


C++ Code 

typedef        void        *va_list       
#define        va_arg(ap,type)        (*((type        *)(ap))++)       
#define        va_start(ap,lastfix)        (ap=…)       
#define        va_end(ap)




(1)可变长参数函数用规定格式定义为“类型函数名(firstfix,…,lastfix,…)”.firstfix,…,lastfix表示函数参数列表中的第一个和最后一个固定参数,该参数列表中至少要有一个固定参数,其作用是为了给变参函数确定列表中参数的个数和参数的类型.

(2)指针类型va_list用来说明一个变量ap(argumentpointer——可变参数指针),此变量将依次引用可变参数列表中用省略号“…”代替的每一个参数.即指向将要操作的变参.

(3) 宏va_start(ap,lastfix)是为了初始化变参指针ap,以指向可变参数列表中未命名的第一个参数,即指向lastfix后的第一个变参.它必须在指针使用之前调用一次该宏,参数列表中至少有一个未命名的可变参数.从宏定义可知其正确性.

(4) 宏va_arg(ap,type)调用,将ap指向下一个可变参数,而ap的类型由type确定,type数据类型不使用float类型.如iap=va_start(ap,int)调用.

(5) 宏va_end(ap)从stdarg.h中看出定义为空,即未定义.其功能完成清除变量ap的作用,表明程序以后不再使用,若该指针变量需再使用,必须重新调用宏va_start以启动该变量.




1.3应用举例




变参类型相同的函数




C++ Code 

#include        
#include        

       //num个int型数相乘       
int        mul(       int        num,        int        data1, ... )       
 {       
                                 int        total        =        data1;       
                                 int        arg,        i;       
                                 va_list        ap;       
                                 va_start(ap,        data1);       
                                 for(i        =        1;        i        <        num;        i++)       
                                 {       
                                                                 arg        =        va_arg(ap,        int);       
                                                                 total        *=        arg;       
                                 }       
                                 va_end(ap);       
                                 return        total;       
 }       

 //i个int型数相乘       
long        mul2(       int        i,        ...)       
 {       
                                 int        *p,        j;       
                                 p        =        &i        +        1;        //p指向参数列表下一个位置
                                long        s        =        *p;       
                                 for        (j        =        1;        j        <        i;        j++)       
                                                                 s        *=        p[j];       
                                 return        s;       
 }       

int        main()       
 {       
                                 printf(       "%d\n",        mul(       3,        2,        3,        5));       
                                 printf(       "%d\n",        mul2(       3,        2,        3,        5));       
                                 return        0;       
 }

举报

相关推荐

0 条评论