C语言可变参数 "..."

一、可变参数函数表示:type fun(int num,...)

其中type表示函数返回值类型,num表示参数个数,而"..."表示所有的参数。

例:char fun(int num,...);

二、va_list,va_start(),va_arg(),va_end()意义及原函数表示。

  1、va_list:表示参数列表。

  2、va_start():初始化参数列表。

  3、va_arg():获取不同类型参数。

  4、va_end():清空参数列表。

  5、typedef char * va_list; 

     #define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )
     #define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
     #define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
     #define va_end(ap) ( ap = (va_list)0 )

  6、(a+b-1)&~(b-1):在a和b都为2的n次方时,可以求出a和b中最大值的最小倍数。

    所以(sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1)可用于字节对齐。

#include<stdio.h> 
#include<stdarg.h>

int func(int num,...)  // num代表参数个数
{  
    char **arr; 
    int inter[2];
    double dou[3];
    int i;
    va_list list;  // 参数列表 
    va_start(list,num);  // 初始化参数列表 
    for(i=0;i<2;i++){
        inter[i]=va_arg(list,int);  // 获取int类型参数
        printf("inter[%d]=%d\n",i,inter[i]);
    }
    
    for(i=0;i<3;i++){
        dou[i]=va_arg(list,double);  // 获取double类型参数 [Warning] 'float' is promoted to 'double' when passed through '...'
        printf("dou[%d]=%lf\n",i,dou[i]);
    }
    
    for(i=0;i<5;i++){
        arr[i]=va_arg(list,char*);  // 获取char *类型参数
        printf("arr[%d]=%s\n",i,arr[i]);
    }
   va_end(list);
return 0; } int main(){ func(10,1,2,1.0,2.0,3.0,"aaa","bbb","ccc","ddd","eee"); }

 

 

 

posted @ 2020-03-08 17:57  hiligei  阅读(661)  评论(0编辑  收藏  举报