频道栏目
首页 > 程序开发 > 软件开发 > C语言 > 正文
[C和指针]不定参数
2013-01-31 08:57:58           
收藏   我要投稿
一,不定参数实例

[html]  

龙8国际娱乐pt老虎机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 

龙8国际娱乐pt老虎机include <stdio.h>  

龙8国际娱乐pt老虎机include <string.h>  

龙8国际娱乐pt老虎机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 龙8国际娱乐pt老虎机%d is:%s\n", argno, para);  

        argno++;  

    }  

    va_end( argp );  

    return 0;  

}  

int  main( void )  

{   www.weifu186.com

    demo("DEMO", "This", "is", "a", "demo!","");  

}  

三,自定义使用

 

[html]  

龙8国际娱乐pt老虎机include <stdio.h>  

龙8国际娱乐pt老虎机include <string.h>  

龙8国际娱乐pt老虎机include <stdarg.h>  

void myprintf(char *fmt, ...)  

{  

    char *pArg = NULL;  

    char c;  

    pArg =(char *)&fmt;  

    pArg+=sizeof(fmt);  

  

    do{//判断每个字符,直到整个语句结束  

        c = *fmt;  

        if(c!=&龙8国际娱乐pt老虎机39;%&龙8国际娱乐pt老虎机39;)  

            putchar(c);  

        else  

        {  

            switch(*++fmt)  

            {  

                case &龙8国际娱乐pt老虎机39;d&龙8国际娱乐pt老虎机39;:  

                    printf("%d",*((int *)pArg));  

                    break;  

            }  

            pArg += sizeof(int);  

        }  

        ++fmt;  

    }while(*fmt !=&龙8国际娱乐pt老虎机39;\0&龙8国际娱乐pt老虎机39;);  

    pArg = NULL;    //va_end  

      

}  

int  main( void )  

{  

    myprintf("the fist : %d\nthe secound : %d\n",1,2);  

}  

 

四,详细说明

        在VC++6.0的include有一个stdarg.h头文件,有如下几个宏定义:

            龙8国际娱乐pt老虎机define   _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )

            龙8国际娱乐pt老虎机define   va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) //第一个可选参数地址

            龙8国际娱乐pt老虎机define   va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) //下一个参数地址

            龙8国际娱乐pt老虎机define   va_end(ap) ( ap = (va_list)0 ) // 将指针置为无效

[html]  

龙8国际娱乐pt老虎机include <iostream>  

  

龙8国际娱乐pt老虎机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);  

  

}  

 

 

点击复制链接 与好友分享!回本站首页
相关TAG标签 指针 参数
上一篇:C语言运算时的参数符号自动转换
下一篇:C语言宏定义时龙8国际娱乐pt老虎机(井号)和龙8国际娱乐pt老虎机龙8国际娱乐pt老虎机(双井号)的用法
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑--致力于做实用的IT技术学习网站

龙8国际娱乐pt老虎机