zoukankan      html  css  js  c++  java
  • 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);

  • 相关阅读:
    树上DP
    区间dp
    [持续更新]学习并记忆 Linux 下的常用的命令
    区间dp
    codevs 2152
    树上DP入门题
    差分与前缀和
    POJ
    VJ
    Week 5: Object Oriented Programming 9. Classes and Inheritance Exercise: int set
  • 原文地址:https://www.cnblogs.com/mxw09/p/1855659.html
Copyright © 2011-2022 走看看