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);
  • 相关阅读:
    js开发规范,在php上也适用
    [读码时间] 仿腾讯微博效果
    [读码时间] 完美拖拽
    [读码时间] div闪烁
    [读码时间]用键盘控制div
    [读码时间] 自定义右键菜单
    [读码时间] 跟随鼠标移动(大图展示)
    [读码时间] 阻止右键菜单
    [读码时间] 按下键盘显示keyCode
    面试(5)
  • 原文地址:https://www.cnblogs.com/yoru/p/4149722.html
Copyright © 2011-2022 走看看