一,不定參數實例
[html]
#include "stdio.h"
/*函數參數是以數據結構"棧"的形式存取,從右至左入棧.eg:*/
void fun(int a, ...)
{
int *temp =&a;
temp++;
int i;
for (i = 0; i < a; ++i)
{
printf("%d\n",*temp);
temp++;
}
}
int main()
{
int a = 1;
int b = 2;
int c = 3;
int d =4;
fun(4, a, b, c, d);
return 0;
}
二,va_list的使用
va_start使argp指向第一個可選參數。
va_arg返回參數列表中的當前參數並使argp指向參數列表中的下一個參數。
va_end把argp指針清為NULL。
函數體內可以多次遍歷這些參數,但是都必須以va_start開始,並以va_end結尾
[html
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
int demo( char *msg, ...)
{
va_list argp;
int argno = 0;
char *para;
va_start(argp, msg);
while (1)
{
para = va_arg(argp,char*);
if (strcmp(para, "") == 0)
break;
printf("Parameter #%d is:%s\n", argno, para);
argno++;
}
va_end( argp );
return 0;
}
int main( void )
{ www.2cto.com
demo("DEMO", "This", "is", "a", "demo!","");
}
三,自定義使用
[html]
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
void myprintf(char *fmt, ...)
{
char *pArg = NULL;
char c;
pArg =(char *)&fmt;
pArg+=sizeof(fmt);
do{//判斷每個字符,直到整個語句結束
c = *fmt;
if(c!='%')
putchar(c);
else
{
switch(*++fmt)
{
case 'd':
printf("%d",*((int *)pArg));
break;
}
pArg += sizeof(int);
}
++fmt;
}while(*fmt !='\0');
pArg = NULL; //va_end
}
int main( void )
{
myprintf("the fist : %d\nthe secound : %d\n",1,2);
}
四,詳細說明
在VC++6.0的include有一個stdarg.h頭文件,有如下幾個宏定義:
#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )
#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 ) // 將指針置為無效
[html]
#include <iostream>
#include <stdarg.h>
const int N=5;
using namespace std;
void Stdarg(int a1,...)
{
va_list argp;
int i;
int ary[N];
va_start(argp,a1);
ary[0]=a1;
for(i=1;i< N;i++)
ary[i]=va_arg(argp,int);
va_end(argp);
for(i=0;i< N;i++)
cout<<ary[i]<<endl;
}
void main()
{
Stdarg(5,12,64,34,23);
}