zoukankan      html  css  js  c++  java
  • C 可变参数

    #include <stdio.h>
    #include <stdarg.h>
    
    extern char* baseconv(unsigned int,int); //格式化数字
    
    void miniprintf(const char *fmt,...)
    {
        const char* p;
        int i;
        unsigned u;
        char* s;
        va_list argp;
        va_start(argp,fmt);
    
        for(p=fmt;*p!='';p++)
        {
            if(*p!='%')
            {
                putchar(*p);
                continue;
            }
            
            switch(*++p)
            {
                case 'c':
                    i=va_arg(argp,int);//“默认参数提升”规则,在可变参数部分
                    putchar(i);
                    break;
                case 'd':
                    i=va_arg(argp,int);
                    if(i<0)
                    {
                        i=-i;
                        putchar('-');
                    }
                    fputs(baseconv(i,10),stdout);
                    break;
                case 'o':
                    u=va_arg(argp,unsigned int);
                    fputs(baseconv(u,8),stdout);
                    break;
                case 's':
                    s=va_arg(argp,char*);
                    fputs(s,stdout);
                    break;
                case 'u':
                    u=va_arg(argp,unsigned int);
                    fputs(baseconv(u,10),stdout);
                    break;
                case 'x':
                    u=va_arg(argp,unsigned int);
                    fputs(baseconv(u,16),stdout);
                    break;
                case '%':
                    putchar('%');
                    break;
            }
        }
        va_end(argp);
    }

    关于可变参数的部分,仔细想想的话:应该是把所有的参数放到了一个块内存中,然后将数据一个个取出来。但是取出来的时候要定义类型,每个类型确定了取出来的内存的大小。

    ps:定义函数时第一个参数不能缺少吧,然参数的开始地址怎么找,至少要给个名字(地址)

    ##15-8-2

    对于函数在栈中

    在这幅图中,可以看到的:
    1.对于函数来说,形参在函数栈的最底端,而且是从后往前开始进栈的;
    2.在形参之后,马上就是函数的返回值数据;
    3.再才是函数自己的局部变量数据

    也就是说在C语言的可变参数这块中,不可或缺的就是第一个参数的确定,第一个参数确定了后面读取多少个参数

    ##15-8-2

    va_arg(argp,var_Type);
  • 相关阅读:
    WCF 转 武胜
    NET(C#):GetHashCode不需要太复杂 转 武胜
    wcf KnownTypeAttribute 武胜
    memmove
    李开复谈创业失败十原因:经不住诱惑 直接山寨
    Linux使用Wine 安装source insight
    VM 中ubuntu下Eclipse ctrl+s 显示update conflict的问题
    ISO/OSI模型
    memset函数使用详解
    C语言中字符串的处理方式
  • 原文地址:https://www.cnblogs.com/yoru/p/4149722.html
Copyright © 2011-2022 走看看