C语言中的可变参数列表源码的剖析与理解

C语言中的可变参数列表

首先写一段简单的代码用来理解可变参数列表

#include<stdio.h>
#include<stdarg.h>//实现可变参数列表时,必须使用此头文件
int Add(int n, ...)
{
    va_list arg;
    int sum=0;
    int i=0;
    va_start(arg, n);
    for(i=0;i<n;i++)
    {
        sum+=va_arg(arg, int);
    }
    va_end(arg);
    return sum;
}
int main()
{
    int sum=0;
    sum=Add(5, 1,2,3,4,5);
    printf("%d\n",sum);
    return 0;
}

这是一个简单的加法函数,我们用可变参数列表的方式来实现它,它就可以来求任意个数的和。


●可变参数函数的定义方法
函数类型 函数名( int 参数个数, … )
●对可变参数函数的深度理解(以上面的简单代码为例)
●va_list:
在vs2013环境下,将va_list转到定义得
这里写图片描述
即为将char* 类型重命名,所以在上面的代码中,

va_list arg;//char* arg;创建一个字符指针

●va_start(arg, n):
将va_start(arg, n)转到定义得:
这里写图片描述
这里写图片描述

INTSIZEOF(n);//当n的大小为123字节时,INSIZEOF(n)=4 
             //当n的大小为567个字节时,INSIZEOF(n)=8 
             //...

即上面的代码中va_start(arg, n)就可以替换为:

arg=(char *)&n + 4;//把n的地址取出并强制类型转换为char*类型
                   //再给n的地址加4并让arg指向将这个地址
                   //即让arg指向参数部分的第一个参数

●va_arg(arg, int):
将va_arg(arg, int)转到定义得:
这里写图片描述
这里写图片描述
将va_arg(arg, int)进行替换:

sum+=(*(int *)((arg+=4)-4));//先将arg加4的值赋给arg
                            //使得arg指向的位置向后挪动4个字节
                            //再将arg-4 使得表达式结果所产生的地址指向原先的位置
                            //将所得到的结果强制类型转换为int*类型并进行解引用

这段代码的作用:取出当前位置参数并为下一次获取参数做好准备。
●va_end(arg):
将va_end(arg)转到定义得:
这里写图片描述
这里写图片描述
代码就可以替换为:

arg=(char*)0;//让指针不再指向原来的位置

猜你喜欢

转载自blog.csdn.net/h___q/article/details/79552705
今日推荐