你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:技术专栏 / C专栏
[C和指针]不定参数
 
一,不定参数实例
[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);  
  
}  
  推荐精品文章

·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录
·2023年10月目录
·2023年9月目录 
·2023年8月目录 

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089