首先寫一段簡單的**用來理解可變引數列表
#include
#include//實現可變引數列表時,必須使用此標頭檔案
int add(int n, ...)
va_end(arg);
return
sum;
}int main()
這是乙個簡單的加法函式,我們用可變引數列表的方式來實現它,它就可以來求任意個數的和。
●可變引數函式的定義方法
函式型別 函式名( int 引數個數, … )
●對可變引數函式的深度理解(以上面的簡單**為例)
●va_list:
在vs2013環境下,將va_list轉到定義得
即為將char* 型別重新命名,所以在上面的**中,
va_list arg;//char* arg;建立乙個字元指標
●va_start(arg, n):
將va_start(arg, n)轉到定義得:
intsizeof(n);//當n的大小為1或2或3位元組時,insizeof(n)=4
//當n的大小為5或6或7個位元組時,insizeof(n)=8
//...
即上面的**中va_start(arg, n)就可以替換為:
arg=(char *)&n + 4;//把n的位址取出並強制型別轉換為char*型別
//再給n的位址加4並讓arg指向將這個位址
//即讓arg指向引數部分的第乙個引數
●va_arg(arg, int):
將va_arg(arg, int)轉到定義得:
將va_arg(arg, int)進行替換:
sum+=(*(int *)((arg+=4)-4));//先將arg加4的值賦給arg
//使得arg指向的位置向後挪動4個位元組
//再將arg-4 使得表示式結果所產生的位址指向原先的位置
//將所得到的結果強制型別轉換為int*型別並進行解引用
●va_end(arg):
將va_end(arg)轉到定義得:
**就可以替換為:
arg=(char*)0;//讓指標不再指向原來的位置
C語言 可變引數列表原始碼的剖析
對可變引數解析之前,我們先看乙個栗子 實現乙個函式可以求任意個引數的平均值。宣告乙個va list型別的變數arg,它用於訪問引數列表的未確定部分。這個變數是呼叫va start來初始化的。它的第乙個引數是va list的變數名,第2個引數是省略號前最後一位有名字的引數。初始化過程把arg變數設定為...
可變引數列表原始碼的剖析
c語言中的可變引數 1 c語言中的可變引數列表 c語言中有時候會遇到一些引數個數是可變的函式,像scanf,printf等,這些函式內部的引數列表都是可變的。通過將函式實現為可變引數的形式,使得函式可以接受1個以上的任意多個引數。不固定 如函式原型 scanf const char format,解...
可變引數列表原始碼的剖析
在某些情況下我們希望函式引數的個數可以根據實際需要來確定,所以c語言中就提供了一種長度不確定的引數,形如 通過將函式實現為可變引數的形式,可以使得函式可以接受1個以上的任意多個引數。典型的例子有printf scanf 函式等,下面就用printf函式的原型為例分析 int printf const...