C语言可变参数

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

int sum(int num, int arg, ...);  

void main()
{
    int num=sum(5,1,2,3,4,5);
    printf("%d\n",num);
}
int sum(int num, int arg, ...)
{
        int n,summary;
        va_list ap;
        if(num < 1) return 0;
    
         n = num;

        va_start(ap, arg);     /*init   ap*/
        summary = arg;
        while(--n > 0)
        {
             summary += va_arg(ap, int);  /*foreach*/
        }

        va_end(ap);  /*dispose ap*/
        return summary;

}

 清爽版:

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

int sum(int,...);
void main()
{
    int num=sum(5,1,3,5,7,9);
    printf("%d\n",num);
}

int sum(int count,...)
{
    int sum=0;
    va_list args;
    va_start(args,count);
    while(count--)
    {
        sum+=va_arg(args,int);
    }
    va_end(args);
    return sum;
}

 不使用库文件版:
#include <stdio.h>

int sum(int,...);
void main()
{
    int num=sum(6,1,3,5,7,9,50);
    printf("%d\n",num);
}

int sum(int count,...)
{
    int sum=0;
    
    //不使用C语言库
    int *p=&count;
    p++;
    while(count--)
    {
        sum+=*p++;
    }
    return sum;
}

 

 

 

 

 

 

 

思考版:

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

int sum(int num, int arg, ...);  

void main()
{
    int num=sum(5,1,3,5,7,9);
    printf("%d\n",num);
}
int sum(int num, int arg, ...)
{
        int n,summary,temp;
        va_list ap;
        if(num < 1) return 0;
    
         n = num;

        va_start(ap, arg);     /*init   ap*/
        summary = arg;
        while(--n > 0)
        {
            //#define va_arg(ap, type)    (*((type *)(ap))++)
            
            //First
            //temp=va_arg(ap,int);
            
            //Second
            temp=(*((int *)(ap))++);//这句代码在VS2008的C++编译器下不通过,会报错“++需要左值”,但是在TurboC下编译通过

            //Third
            /*temp= *(int *)ap;
            ap+=4;    */
            
        
            printf("%d,\n",temp);
            summary +=temp;  /*foreach*/
        }

        va_end(ap);  /*dispose ap*/
        return summary;
}

 

以下代码也是在C中编译通过,在C++中不能通过

void main()
{
    int arr[3]={5,8,9};
    void *p=arr;
    (*((int *)(p))++);
    
    printf("%d\n",*(int*)p);
    /*
    int num=sum(5,1,3,5,7,9);
    printf("%d\n",num);
    */

 

 

 

 

 

解密函数参数:

#include <stdio.h>

void Fun(char c,int i, char* s,double d,int e)
{
    char *p=&c;
    int *p2;
    char **p3;
    double *p4;
    int *p5;

    clrscr();

    printf("%c\n",*p);
  // p++;  如果p++,则不管在TurboC还是Vs2008中都会报错,为什么?难道char类型的参数传参过程中不是只占一个字节?
    p+=2;//在TurboC中为p+=2,在VS2008中位p+=4(TurboC中int占2个字节,VS2008中int占4个字节)



    p2=(int *)p;
    printf("%d\n",*p2);
    p2++;

    p3=(char **)p2;
    printf("%s\n",*p3);
    p3++;

    p4=(double *)p3;
    printf("%f\n",*p4);
    p4++;

    p5=(int *)p4;
    printf("%d\n",*p5);

}

void main()
{
    Fun('A',999,"hello",5.66,456);

posted @ 2010-10-19 16:39  再快一点  阅读(212)  评论(0编辑  收藏  举报