久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

C語言可變參數(shù)(va_arg,va_list,va_start,va_end)

 魅影蒼穹 2017-02-22

一,、什么是可變參數(shù)

         在C語言編程中有時(shí)會(huì)遇到一些參數(shù)個(gè)數(shù)可變的函數(shù),,例如printf(),scanf()函數(shù),其函數(shù)原型為:
int printf(const char* format,…),,int scanf(const char *format,…);它除了有一個(gè)參數(shù)format固定以外,,后面跟著的參數(shù)的個(gè)數(shù)和類型是可變的(用三個(gè)點(diǎn)“…”做參數(shù)占位符),實(shí)際調(diào)用時(shí)可以有以下的形式:
           printf(“%d”,i);  printf(“%d,%c”,i,j);

二,、C語言---簡單的可變參數(shù)例子(實(shí)現(xiàn)思想)

        1,、整型數(shù)據(jù)的輸出

復(fù)制代碼
#include <stdio.h>
#include <stdarg.h>
void ar_cnt(int cnt,...);
void ar_cst(char const *s,...);
int main(int argc, char* argv[])
{
    int in_size =_INTSIZEOF(int);
    printf("int_size=%d\n",in_size);
    ar_cnt(5,1,2,3,4);
    return 0; 
}
void ar_cnt(int cnt,...)
{
    int value1=0;
    int i=0;
    int arg_cnt = cnt;
    va_list arg_ptr;
    va_start(arg_ptr,cnt);
    for(i=0;i<cnt;i++)
    {
        value1=va_arg(arg_ptr,int);
        printf("posation %d=%d\n",value1,i+1);
    }
    va_end(arg_ptr);
}
復(fù)制代碼

運(yùn)行結(jié)果:

image

        2、字符串的輸出

復(fù)制代碼
#include <stdio.h>
#include <stdarg.h>

void PrintLines(char *first,...)
{
    char *str;
    va_list v1;
    str = first;
    va_start(v1,first);
    do 
    {
        printf("%s\n",str);
        str=va_arg(v1,char*);
    } while (str != NULL );
    va_end(v1);
}

int main(int argc, char* argv[])
{
    PrintLines("First","Second","Third","Fourth",NULL);
    return 0;
}
復(fù)制代碼

運(yùn)行結(jié)果:

image

           3,、找出最大數(shù)

復(fù)制代碼
#include <stdio.h>
#include <stdarg.h>
int FindMax(int amount,...)
{
    int i,val,great;
    va_list v1;
    va_start(v1,amount);
    great=va_arg(v1,int);
    for(i=1;i<amount;i++)
    {
        val=va_arg(v1,int);
        great=(great>val)?great:val;
    }
    va_end(v1);
    return great;
}

int main(int argc, char* argv[])
{
    int max=FindMax(5,100,20,456,102,4,300);
    printf("The Max one is %d\n",max);
    return 0;
}
復(fù)制代碼

運(yùn)行結(jié)果:

image

三,、對(duì)va_arg,va_list,va_start,va_end,_INTSIZEOF剖析

 

  • 內(nèi)存對(duì)齊  #define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )
                 具體請(qǐng)參考:http://blog.csdn.net/swell624/article/details/3210779
  • 可變參數(shù)用到以下宏函數(shù) 
        <1>原型:
    void va_start(va_list arg_ptr,prev_param);

              功能:以固定參數(shù)的地址為起點(diǎn)確定變參的內(nèi)存起始地址,獲取第一個(gè)參數(shù)的首地址

              返回值:無

        <2>原型:va_list 類型的變量,,va_list arg_ptr ,這個(gè)變量是指向參數(shù)地址的指針,,因?yàn)榈玫絽?shù)的地址之后,再結(jié)合參數(shù)的類型,,才能得到參數(shù)的值,。

        <3>原型:type va_arg(va_list arg_ptr,type);

              功能:獲取下一個(gè)參數(shù)的地址

            返回值:根據(jù)傳入?yún)?shù)類型決定返回值類型

        <4>原型:void  va_end(va_list arg_ptr);

              功能:將arg_ptr指針置0

             返回值:無

  • 使用可變參數(shù)應(yīng)該有以下步驟

     ⑴在程序中將用到以下這些宏:

    void va_start( va_list arg_ptr, prev_param );

    type va_arg( va_list arg_ptr, type );

    void va_end( va_list arg_ptr );

    va在這里是variable-argument(可變參數(shù))的意思.

    這些宏定義在stdarg.h中,所以用到可變參數(shù)的程序應(yīng)該包含這個(gè)頭文件.

    ⑵函數(shù)里首先定義一個(gè)va_list型的變量,這里是arg_ptr,這個(gè)變量是指向參數(shù)地址的指針.因?yàn)榈玫絽?shù)的地址之后,再結(jié)合參數(shù)的類型,,才能得到參數(shù)的值,。

    ⑶然后用va_start宏初始化⑵中定義的變量arg_ptr,這個(gè)宏的第二個(gè)參數(shù)是可變參數(shù)列表的前一個(gè)參數(shù),也就是最后一個(gè)固定參數(shù)。

    ⑷然后依次用va_arg宏使arg_ptr返回可變參數(shù)的地址,得到這個(gè)地址之后,,結(jié)合參數(shù)的類型,,就可以得到參數(shù)的值。然后進(jìn)行輸出,。

    ⑸設(shè)定結(jié)束條件,,這里的條件就是判斷參數(shù)值是否為-1。注意被調(diào)的函數(shù)在調(diào)用時(shí)是不知道可變參數(shù)的正確數(shù)目的,,程序員必須自己在代碼中指明結(jié)束條件,。至于為什么它不會(huì)知道參數(shù)的數(shù)目,讀者在看完下面這幾個(gè)宏的內(nèi)部實(shí)現(xiàn)機(jī)制后,,自然就會(huì)明白,。

 

 

三,、參考文獻(xiàn):
       http://www./articles/26262.shtml

        http://www.cnblogs.com/wangyonghui/archive/2010/07/12/1776068.html

        http://www./kf/201204/129038.html

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多