变参与不定参数

今天在重新温习C语言的窗口设计时看到了这样的一个知识:va_list

好奇之下查看了它的定义:

typedef char *  va_list;
原来是宏定义的字符串指针!且头文件在stdarg.h中。

接下来我往下看,发现还有三个成员:va_start,va_arg,va_end

#define va_start(ap,v)  ( ap = (va_list)&v + _INTSIZEOF(v) )
#define va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define va_end(ap)      ( ap = (va_list)0 )

因为使用msdn不方便,我直接在网上百度了下。

首先先要定义一个va_list的变量

va_list szList;

va_start(ap,v):其中ap就是定义的va_list的变量,也就是进行初始化。

va_arg(ap,t):其中t就是第一个可变参数之前的一个参数。每次返回参数后指针向后移送t类型的最小整数倍。

va_end(ap):这个就不用说了,就是清空参数列表。


后来我开始尝试这个宏的用法。

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


void mylist(char* temp2,char * temp,...)
{
int j=0;
va_list szList;


va_start(szList,temp);
int i=3;
while (i>0)
{
j=va_arg(szList,int);
printf("%s,%d\n",temp,j);
i--;
}
va_end(szList);

return;
}
int main()
{
mylist("11","ss",10,20,30);
return 0;
}

之所以有两个字符串变量,是因为我进行了一次实验,把mylist中的temp全部换成temp2,(也就是在va_arg中把参数提前一位看看是什么效果。)最后结果果然是从第一个参数地址往后运算。


参考地址:http://www.cnblogs.com/mr-wid/archive/2012/10/08/2715071.html

以及百度百科:http://baike.baidu.com/link?url=aNpGQf2c1tZWyXw8_nwmy_aiMw0losTnI4hSjIv6qQKch0OtINaYw5hTw86Y-Dc00LCRdYKt8Yat06rvomW6G_


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值