• 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
    ",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
    ",i,dou[i]);
        }
        
        for(i=0;i<5;i++){
            arr[i]=va_arg(list,char*);  // 获取char *类型参数
            printf("arr[%d]=%s
    ",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"); }

     

  • 相关阅读:
    跨域资源共享 CORS 详解
    C# 每月第一天和最后一天
    jexus http to https
    ASP.NET MVC 路由学习
    jexus
    centos7 添加开机启动项
    jexus docker
    HTTP2.0新特性
    jexus配置支持Owin
    Autofac Named命名和Key Service服务
  • 原文地址:https://www.cnblogs.com/ligei/p/12443841.html
Copyright © 2020-2023  润新知