参数数目不定的函数

在我们用到的函数中 printf 中就用到了参数数目不定的函数,我们不去分析 printf 实现的原理,我们直接来说明如何编写参数可变的函数

我们先来看看一个简单的例子:

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

int demo(char *a, ...);

int main(int argc, const char *argv[])
{
    demo("1:DEMO", "2:lip", "3:xxx", "");

    return 0;
}

int demo(char *a, ...)
{
    va_list argp;
    int argnum = 0;
    char *para;

    va_start(argp, a);

    while (1)
    {
        para = va_arg(argp, char *);

        if (strcmp(para, "") == 0)
            break;

        printf("parameter #%d is : %s\n", argnum, para);

        argnum++;
    }

    va_end(argp);
}

程序的说明:

【1】在函数定义的时候,不确定有多少数目的参数的地方用“...”代替

【2】在函数实现的时候,需要先声明一个能指向占空间的指针 va_list,

【3】在要用到变量的地方,调用 va_start 将 va_list 指针指向 a变量的桟空间的下一个地址,

【4】调用 va_arg,va_arg的行为是将地址指针强制转化成 (char *),并且返回此地址上存放的类型为char * 的内容,然后指针指向下个地址

【5】别忘了释放指针 va_end

【6】还有写需要知道的知识是,一般桟的空间增长和指针的增长是相反的,参数存到栈的顺序是 从最后边 往前边存,即如fun(a, b, c, d),d先进栈然后c...,因此上边说明中指针指向下一个地址取出后边的参数就可以理解了吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值