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

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>
            国产三级精品三级| 亚洲欧美制服另类日韩| 欧美精品色综合| 欧美不卡在线视频| 欧美精品久久一区| 欧美日韩国产天堂| 午夜精品视频在线观看一区二区| 美女国产精品| 欧美精品日韩一本| 欧美国产激情二区三区| 欧美国产日韩在线| 国产精品久久久久77777| 欧美激情精品| 99热这里只有精品8| 在线亚洲自拍| 亚洲欧美在线x视频| 久久久噜噜噜久久人人看| 麻豆久久婷婷| 欧美视频一区二区三区…| 国产精品欧美久久| 亚洲美女av黄| 亚洲国产高清自拍| 亚洲欧美成人一区二区三区| 久久精品女人的天堂av| 亚洲激情图片小说视频| 亚洲精品国产精品国自产在线| 亚洲精品一线二线三线无人区| 亚洲一区二区三区国产| 老妇喷水一区二区三区| 国产精品日韩在线播放| 亚洲激情视频在线播放| 午夜精品国产| 亚洲国产另类精品专区 | 欧美激情视频免费观看| 中文一区字幕| 老牛嫩草一区二区三区日本 | 欧美视频在线观看 亚洲欧| 国产亚洲一区在线播放| 日韩一级不卡| 欧美~级网站不卡| 亚洲免费视频成人| 国产欧美日韩综合| 亚洲图片你懂的| 亚洲成人中文| 久久国产精品久久w女人spa| 国产精品欧美一区喷水| 一区二区三区欧美成人| 亚洲小说欧美另类婷婷| 亚洲福利视频网站| 久久久欧美精品| 国产日韩一级二级三级| 午夜在线a亚洲v天堂网2018| 亚洲理伦在线| 欧美日韩 国产精品| 亚洲日本在线视频观看| 欧美国产精品v| 久久综合狠狠综合久久激情| 狠狠干成人综合网| 一区二区三区国产精华| 亚洲美女av黄| 欧美大片一区二区| 亚洲激情在线观看| 亚洲高清视频的网址| 久久只精品国产| 在线国产欧美| 亚洲国产一区视频| 欧美精品一区二区视频| 99国产精品视频免费观看| 亚洲国产第一页| 欧美电影打屁股sp| 99国产精品一区| 99视频一区二区| 国产精品外国| 久久亚洲欧洲| 欧美成人tv| 亚洲一区二区三区精品在线观看 | 红桃视频国产精品| 久久综合狠狠综合久久激情| 久久免费视频在线观看| 日韩视频免费观看| 99精品国产在热久久婷婷| 国产精品久久久久毛片大屁完整版 | 老色批av在线精品| 久久精品综合| 亚洲精品免费在线播放| 日韩亚洲欧美成人一区| 国产精品一区二区男女羞羞无遮挡| 欧美在线高清| 免费日韩av片| 亚洲狠狠婷婷| 欧美日韩免费网站| 亚洲美女91| 亚洲欧美国产精品桃花| 在线观看av一区| 日韩一区二区精品| 国产一区二区三区精品欧美日韩一区二区三区 | 欧美大片免费观看| 欧美性视频网站| 乱人伦精品视频在线观看| 欧美精彩视频一区二区三区| 性视频1819p久久| 欧美国产日本| 久久精品国产久精国产爱| 亚洲国产综合视频在线观看| 欧美亚洲成人网| 亚洲高清久久| 国产婷婷精品| 夜夜狂射影院欧美极品| 在线播放中文字幕一区| 亚洲一区二区三| 亚洲最新在线| 麻豆av福利av久久av| 国产精品日韩久久久| 亚洲高清视频在线| 国产精品swag| 欧美激情一区二区在线| 国产婷婷色一区二区三区在线| 91久久久精品| 亚洲高清在线观看| 欧美在线观看一二区| 午夜精品美女自拍福到在线| 欧美激情成人在线| 欧美激情一区二区三区全黄| 激情欧美丁香| 久久国产日本精品| 久久国产精品99精品国产| 欧美吻胸吃奶大尺度电影| 亚洲精品男同| 99国产精品久久| 亚洲国产日韩欧美在线图片| 国产一区视频在线观看免费| 亚洲一区二区三区免费视频| 亚洲私人影吧| 欧美日韩国产综合视频在线观看中文| 免费看成人av| 亚洲高清免费在线| 狂野欧美激情性xxxx欧美| 亚洲欧美在线磁力| 亚洲欧美另类国产| 欧美成在线视频| 亚洲国产清纯| 一本色道久久88综合日韩精品| 欧美大片国产精品| 亚洲欧洲日产国产综合网| 一片黄亚洲嫩模| 国产精品卡一卡二| 亚洲专区欧美专区| 欧美自拍偷拍午夜视频| 国内成人精品2018免费看| 久久九九免费视频| 欧美激情精品久久久久久黑人 | 亚洲女同精品视频| 国产精品久久网站| 午夜精品影院| 国产一区二区久久| 米奇777在线欧美播放| 亚洲黄页一区| 一区二区国产日产| 国产精品看片资源| 久久久久久成人| 亚洲黄一区二区| 欧美在线视频日韩| 在线一区观看| 国内精品模特av私拍在线观看| 久久久国产精品一区二区中文| 亚洲国产婷婷香蕉久久久久久| 亚洲伊人伊色伊影伊综合网| 国产色产综合产在线视频| 免费欧美高清视频| 亚洲一本视频| 欧美成人一品| 亚洲欧美色婷婷| 亚洲国产精品一区二区第四页av| 欧美日韩一区国产| 久久久精品午夜少妇| 一区二区三区欧美激情| 久久久久免费视频| 一区二区三区高清视频在线观看| 狠狠色综合色区| 美女日韩欧美| 亚洲综合成人在线| 欧美激情无毛| 国产日韩成人精品| 欧美成人中文| 久久精品1区| 中文日韩在线| 亚洲国产精品小视频| 欧美一区观看| 亚洲激情在线播放| 国产一区日韩二区欧美三区| 欧美二区在线播放| 国内成人精品2018免费看| 久久色在线播放| 亚洲欧美综合国产精品一区| 亚洲精品激情| 欧美激情第五页| 欧美ed2k| 女人天堂亚洲aⅴ在线观看| 欧美中文字幕在线| 亚洲制服av|