• 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);
  • 相关阅读:
    Python学习
    我的计算机网络复习笔记(第一章)
    理解DES算法
    彻底理解RSA加密算法
    扩展欧几里得算法求模的乘法逆元
    python的deque(双向)队列详解
    对于暴力枚举的一些优化方法的题解
    python中的多(liu)元(mang)交换 ,赋值
    python定义函数后跟->的意义
    直接暴力做分糖问题
  • 原文地址:https://www.cnblogs.com/yoru/p/4149722.html
Copyright © 2020-2023  润新知