可變參數的函數

當我們無法列出傳遞函數的所有實參的類型和數目時,可以用省略號指定參數表

- (void)parameterList:(NSString *)a,...;

函數參數是以數據結構:棧的形式存取,從右至左入棧。

void func(int x, float y, char z);

調用函數的時候,實參 char z 先進棧,然后是 float y,最后是 int x,因此在內存中變量的存放次序是 x->y->z,因此,從理論上說,我們只要探測到任意一個變量的地址,并且知道其他變量的類型,通過指針移位運算,則總可以找到其他的輸入變量。

獲取參數:

//va_list 是一個字符指針
//可以理解為指向當前參數的一個指針
//取參必須通過這個指針進行。
typedef char * va_list;

void va_start ( va_list ap, prev_param ); 
type va_arg ( va_list ap, type ); 
void va_end ( va_list ap ); 
  1. 在調用參數表之前,定義一個 va_list 類型的變量,(假設va_list 類型變量被定義為ap);
  2. 然后應該對ap 進行初始化,讓它指向可變參數表里面的第一個參數,這是通過 va_start 來實現的,第一個參數是 ap 本身,第二個參數是在變參表前面緊挨著的一個變量,即“...”之前的那個參數;
  3. 然后是獲取參數,調用va_arg,它的第一個參數是ap,第二個參數是要獲取的參數的指定類型,然后返回這個指定類型的值,并且把 ap 的位置指向變參表的下一個變量位置;
  4. 獲取所有的參數之后,我們有必要將這個 ap 指針關掉,以免發生危險,方法是調用 va_end,他是輸入的參數 ap 置為 NULL。通常va_start和va_end是成對出現。

例子:

- (void)parameterList:(int)a,... {
    
    va_list argp;   //定義保存函數參數的結構
    int argno = 0;
    int para;       //argp指向傳入的第一個可選參數,a是最后一個確定的參數
    va_start( argp, a);
    
    while (1) {
        para = va_arg( argp, int);
        if ( para == 0 ) { break; }
        NSLog(@"Parameter #%d is: %d\n", argno, para);
        argno++;
    }
    va_end( argp ); //將argp置為NULL
}


- (void)parameterStringList:(NSString *)msg,...{

    va_list argp;
    NSString * parameter;
    va_start(argp, msg);
    
    while (1) {
        parameter = va_arg(argp, NSString *);
        if (parameter == nil) { break; }
        NSLog(@"parameter: %@", parameter);
    }
    
    va_end(argp);

}

運行結果:

可變參數函數調用
References:

http://www.cnblogs.com/hanyonglu/archive/2011/05/07/2039916.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 我們在C語言編程中會遇到一些參數個數可變的函數,例如printf() 這個函數,它的定義是這樣的: int pri...
    Mr_Me閱讀 772評論 0 2
  • 原文地址:C語言函數調用棧(一)C語言函數調用棧(二) 0 引言 程序的執行過程可看作連續的函數調用。當一個函數執...
    小豬啊嗚閱讀 4,710評論 1 19
  • 1.在C中,變長參數的函數即參數個數可變、參數類型不定 的函數。當我們無法列出傳遞函數的所有實參的類型和數目時,以...
    孤獨雜貨鋪閱讀 1,779評論 1 1
  • 我們常見的可變參數是這樣的 這樣的 提示框 1,實現的方法 - (void)sayHello:(NSString*...
    Demonboy閱讀 811評論 0 0
  • 人要活在當下,活的實際。 每個人都有夢想,都有自己渴望的詩與遠方,但是我們不是獨立存在的一個人,我們有親情圈,有朋...
    Jenna_yang閱讀 229評論 0 0