青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數據加載中……

可變參數傳遞方法

       有時候,我們寫函數的時候,可能遇到參數數量不確定的情況,這樣的函數例如Cprintf打印函數。你可以使用printf("some string"), 也可以使用printf("%d", aintvalue)。是不是C的庫里包含了不同定義的printf函數呢?答案肯定是否定的,因為C是不支持函數的重載的。每個函數只能由一個版本。那么是如何實現類似這種可變參數傳遞的函數呢?在這講三種方法。

1)方法1:使用va_list
         
涉及到如下變量和函數(摘自msdn):
type va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );
void va_start( va_list arg_ptr );   (UNIX version)
void va_start( va_list arg_ptr, prev_param );   (ANSI version)
        
參數含義:
type
:參數類型
arg_ptr
:指向參數列表的指針
prev_param
:第一個參數的類型

         下面采用msdn里的一個例子。

1.        /* VA.C: The program below illustrates passing a variable

2.        * number of arguments using the following macros:

3.        *      va_start            va_arg              va_end

4.        *      va_list             va_dcl (UNIX only)

5.        */

6.         

7.        #include <stdio.h>

8.        #define ANSI            /* Comment out for UNIX version     */

9.        #ifdef ANSI             /* ANSI compatible version          */

10.    #include <stdarg.h>

11.    int average( int first, ... );

12.    #else                   /* UNIX compatible version          */

13.    #include <varargs.h>

14.    int average( va_list );

15.    #endif

16.     

17.    void main( void )

18.    {

19.       /* Call with 3 integers (-1 is used as terminator). */

20.       printf( "Average is: %d\n", average( 2, 3, 4, -1 ) );

21.     

22.       /* Call with 4 integers. */

23.       printf( "Average is: %d\n", average( 5, 7, 9, 11, -1 ) );

24.     

25.       /* Call with just -1 terminator. */

26.       printf( "Average is: %d\n", average( -1 ) );

27.    }

28.     

29.    /* Returns the average of a variable list of integers. */

30.    #ifdef ANSI             /* ANSI compatible version    */

31.    int average( int first, ... )

32.    {

33.       int count = 0, sum = 0, i = first;

34.       va_list marker;

35.     

36.       va_start( marker, first );     /* Initialize variable arguments. */

37.       while( i != -1 )

38.       {

39.          sum += i;

40.          count++;

41.          i = va_arg( marker, int);

42.       }

43.       va_end( marker );              /* Reset variable arguments.      */

44.       return( sum ? (sum / count) : 0 );

45.    }

46.    #else       /* UNIX compatible version must use old-style definition.  */

47.    int average( va_alist )

48.    va_dcl

49.    {

50.       int i, count, sum;

51.       va_list marker;

52.     

53.       va_start( marker );            /* Initialize variable arguments. */

54.       for( sum = count = 0; (i = va_arg( marker, int)) != -1; count++ )

55.          sum += i;

56.       va_end( marker );              /* Reset variable arguments.      */

57.       return( sum ? (sum / count) : 0 );

58.    }

59.    #endif

          通過上面的例子可以清楚知道怎么傳遞可變參數了。

2)方法2:利用參數入棧原理  
        
在現有的32位的機器上,一般通過將參數按照由低地址到高地址的順序依次入棧實現傳遞,因此把第一參數的指針依次增加,就可以得到后面的參數了。例如:

1.        struct s1 

2.        {

3.            int a;

4.            char b;

5.        };

6.         

7.        struct s2 

8.        {

9.            int a;

10.    };

11.     

12.    void function (struct s1 a, ...) 

13.    {

14.        struct s1*  pa = &a;

15.        printf("%d, %c\n", pa->a, pa->b);

16.        ++pa;

17.        printf("%d, %c\n", pa->a, pa->b);

18.        ++pa;

19.        printf("%d\n", (struct s2*)pa->a);  //強制轉換為struct s2類型

20.    }

21.    void main( void )

22.    {

23.        struct s1 a1 = {1, 'A'};

24.        struct s1 a2 = {2, 'B'};

25.        struct s2 a3 = {10};

26.        function(a1, a2, a3); //a3的類型不同于a1 a2

27.        return;

28.    }

29.     

        用這種方法傳遞可變參數非常簡單。


3)方法3:用數組傳參

 

1.        void   function(Type a[])   

2.        {   

3.          ...   

4.          a[0];    

5.          a[1];   

6.          ...   

7.        }

這種方法就不嘮叨了,相信地球人都知道。       

 

posted on 2009-08-12 12:57 肥仔 閱讀(2519) 評論(0)  編輯 收藏 引用 所屬分類: C++ 基礎

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲欧美在线播放| 欧美另类视频| 亚洲区国产区| 免费欧美在线| 欧美国产一区在线| 99国内精品久久| 亚洲视频一区在线| 欧美一级电影久久| 久久在线观看视频| 欧美激情中文不卡| 欧美日韩在线一区二区三区| 亚洲影视在线| 久久精品国产久精国产爱| 欧美一区网站| 欧美大片在线观看一区| 欧美婷婷久久| 亚洲第一精品夜夜躁人人爽| 悠悠资源网亚洲青| 一区二区三区视频在线播放| 一区二区精品| 久久精品伊人| 国产免费一区二区三区香蕉精| 欧美高清视频一区| 夜夜嗨av一区二区三区四区 | 久久视频在线免费观看| 浪潮色综合久久天堂| 欧美电影免费| 合欧美一区二区三区| 亚洲精品在线一区二区| 亚洲在线一区二区三区| 久久精品国产亚洲一区二区三区| 久久青草久久| 亚洲精品社区| 久久国产毛片| 国产精品乱码| 亚洲视频精品| 亚洲激情国产精品| 久久国产精品毛片| 国产精品久久久久久久久久三级 | 美女日韩欧美| 一区二区动漫| 久久深夜福利免费观看| 欧美视频在线观看一区二区| 国产精品一区二区视频| 在线观看成人av| 久久精品国产精品亚洲| 日韩亚洲欧美成人一区| 久久综合狠狠综合久久综青草| 欧美午夜视频一区二区| 亚洲欧洲一区二区在线观看| 亚洲视频国产视频| 亚洲精品一区二区在线观看| 久久爱www久久做| 国产精品一区二区三区观看| 亚洲国产欧美久久| 欧美a级大片| 久久在线免费观看| 激情综合亚洲| 欧美激情无毛| 欧美电影免费观看高清完整版| 国产一区二区三区奇米久涩 | 巨乳诱惑日韩免费av| 国产啪精品视频| 欧美在线网址| 久久国产黑丝| **网站欧美大片在线观看| 久久裸体艺术| 麻豆精品视频在线观看视频| 国产精品中文字幕欧美| 欧美一级黄色网| 亚洲欧洲av一区二区| 国产伦精品一区二区三区照片91 | 国产日韩一区| 亚洲精品字幕| 亚洲精品黄色| 一本久久精品一区二区| 亚洲一区二区三区激情| 亚洲国产女人aaa毛片在线| 9色精品在线| 一本久久综合| 国产精品久久二区二区| 亚洲欧洲精品一区二区三区不卡| 国产精品乱人伦中文| 亚洲国产美女| 亚洲综合视频一区| 国产欧美日韩麻豆91| 最新精品在线| 亚洲视频每日更新| 一区二区三区日韩欧美精品| 欧美福利电影在线观看| 一区二区成人精品| 国产精品乱码一区二三区小蝌蚪 | 久久免费国产| 一区二区三欧美| 欧美亚洲免费高清在线观看| 国产日韩久久| 亚洲经典三级| 国产欧美日韩不卡免费| 久久久久免费观看| 欧美日韩国产精品一区| 欧美亚洲在线播放| 蜜臀久久久99精品久久久久久 | 久久亚洲一区二区三区四区| 性做久久久久久久免费看| 尤物网精品视频| 亚洲天堂网站在线观看视频| 国产精品久久久久久久久免费| 久久精品中文字幕一区| 欧美高清在线视频| 久久国产精彩视频| 欧美日韩国产色综合一二三四| 性久久久久久| 麻豆精品91| 欧美成人国产va精品日本一级| 午夜精品短视频| 亚洲日本中文字幕免费在线不卡| 中国成人在线视频| 亚洲精品一级| 久久久久99精品国产片| 亚洲午夜免费福利视频| 久久久人成影片一区二区三区| 亚洲欧美欧美一区二区三区| 久久久久.com| 久久综合给合久久狠狠狠97色69| 国产精品www.| 一本久道久久综合狠狠爱| 在线观看亚洲a| 欧美在线视频免费| 亚洲欧美一区二区原创| 欧美精品日韩www.p站| 久久偷窥视频| 久久精品官网| 欧美激情五月| 亚洲欧美激情视频| 在线视频精品| 欧美日韩成人一区| 亚洲欧洲日夜超级视频| 国产欧美在线观看| 亚洲一区二区在线免费观看| 亚洲激情国产| 欧美二区在线观看| 亚洲国产成人高清精品| 亚洲第一天堂av| 免费欧美电影| 亚洲精品一区中文| 亚洲一区在线视频| 国产精品一区久久久| 亚洲一区二区精品在线| 一本一道久久综合狠狠老精东影业 | 午夜久久电影网| 欧美在线三级| 国内精品视频在线播放| 欧美专区亚洲专区| 免费在线国产精品| 亚洲美女网站| 国产精品乱码久久久久久| 亚洲午夜一区二区| 久久蜜桃资源一区二区老牛| 国产精品日产欧美久久久久| 亚洲肉体裸体xxxx137| 一区二区国产日产| 国产欧美精品xxxx另类| 久久精品视频在线看| 你懂的国产精品永久在线| 亚洲日本在线观看| 国产精品美女主播| 麻豆freexxxx性91精品| 亚洲老板91色精品久久| 亚洲欧美日韩一区| 亚洲国产成人av| 国产精品福利在线观看| 欧美亚洲在线观看| 国产日韩在线视频| 免费看亚洲片| 99成人免费视频| 国产欧美一区二区精品婷婷 | 欧美一区二区私人影院日本 | 亚洲国产激情| 亚洲一区二区三区乱码aⅴ| 欧美黄污视频| 午夜精品久久久| 亚洲人成网站色ww在线| 亚洲欧洲99久久| 亚洲国内在线| 国产亚洲人成a一在线v站| 久久综合狠狠| 亚洲免费视频一区二区| 欧美成人精品在线观看| 亚洲视频一起| 亚洲黄色在线看| 国产午夜精品美女毛片视频| 久久久福利视频| 亚洲一区二区三区免费在线观看| 久久久久久电影| 亚洲欧美国产精品专区久久| 国产一区香蕉久久| 国产精品欧美一区二区三区奶水| 久久婷婷丁香| 久久精品二区三区| 午夜精品999|