对va_start,va_arg,va_end的认识

来源:互联网 发布:如何选择电视机 知乎 编辑:程序博客网 时间:2024/06/12 12:05
 相信大多数人接触这3个函数应该是在数据结构的数组和广义表这一章节中,大家发现了没有在对数组基本操作函数原型说明中很多的变量都用"..."给省略了如下

       status Initarray(array &a,int din,...);//若维数din和随后的长度合法,则构造相应的数组A,并返回OK。

       status value(array a,ElemType &e,...);//若各下标(这里的下标在函数中是"...")不超界则e赋值为所指定的A的元素之,并返回OK

       那这个省略号所代表的数值如何提取呢?请看如下的一个简单的程序

#include<stdio.h>
#include<stdarg.h>
int N=5;
void Stdarg(int a1,...)//这里一定要用3个'.'表示省略,多一个少一个都会犯错,我试过了
{
    va_list argp;//这里定义argp是可变参数的类型,
    int i;
    int ary[5];
    va_start(argp,a1);//这里的a1就是5,这句话的作用好比指针,让argp指向a1
    ary[0]=a1;
    for(i=1;i<N;i++)
       ary[i]=va_arg(argp,int);//每运行一次va_arg则argp自动指向下一个变量比如第一次运行是5第二次所得到的值就是12了
    va_end(argp);//有点像文件章节的脱钩fclose的性质让argp脱钩
    for(i=0;i<N;i++)
    printf("%d ",ary[i]);
}
void main()
{
    Stdarg(5,12,64,34,23);
}

这样一解释大家应该明白这4个函数到底是做什么用了吧,再一些细节,我就讲不出了由于水平有限只能解释道这里了如果还有什么不明白的就看我那个转载的,那个写得太详细里。

       有一个地方不得不说一下va_arg(argp,int);这个函数每运行一次argp的指针指向下一个地址但是这个下一个地址是下一个数值的地址而并不是内存中的地址如表

argp第一次指向的是5也就是指向1000这个地址再一次运行va_arg(argp,int);的时候argp指针改变指向的是12的地址8000也可能是1002(这个地址完全是系统自动分配的,并不是以线形方式进行分配)以此类推

还有一点要说明一下

va_start(argp,a1);
    ary[0]=a1;
    for(i=1;i<N;i++)/**********************/
       ary[i]=va_arg(argp,int);

大家发现没有i从1开始

因为va_start(argp,a1);这个函数让argp指向a1的时候的同时argp也像下移动到下一个变量的位置了希望大家能够明白。