函式可變參數
參數
函式第1個參數要有值,不管任何類型都可以。
第2個參數為…,…一定要放函式參數最後面。
傳回值 函式名(任何類型 參數名, ...)
void func1(int num, ...)
多個參數範例
傳回值 函式名(任何類型 參數名1,任何類型 參數名2,任何類型 參數名3, ...)
void func1(char c, int num, double d, ...)
va_list
va_list實際上是一個指標,宣告指向可變參數的指標。
1
va_list v1;
va_start
宣告va_list的開始位址。
第2個參數為可變參數...
的前一個參數名。
1
va_start(v1, num);
本範例可變參數的前一個參數名為num。
1
void func1(int num, ...)
va_list指標移到...
可變參數的第0個位罝。
前一個 va_list
↓ ↓
func1(3, 10, 30, 20);
印出可變參數指向的值
va_list實際上是一個指標,所以要印出它指向的值,要使用取值運算子*。
1
2
3
4
5
6
7
8
9
void func1(int num, ...) {
va_list v1;
va_start(v1, num);
printf("v1 = %d \n",* v1);
}
int main() {
func1(3, 10, 30, 20);
return 0;
}
v1 = 10
va_arg 指標移動
第1個參數為可變參數指標,第2個參數為傳回值類型。
每呼叫一次va_arg()函式,先傳回va_list的值*va_list
,然後移動va_list指標+1,實際上是根據第2個參數知道移動的byte數目,int是4byte,所以記憶體會移動4byte,移到下一個參數位置。
傳回值類型 va_arg(v1, 傳回值類型);
一開始指向的位址
va_list
↓
func1(3, 10, 30, 20);
va_list指標+1
va_list
↓
func1(3, 10, 30, 20);
完整程式碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void func1(int num, ...) {
va_list v1;
va_start(v1, num);
printf("v1 = %d \n",*v1);
int val = 0;
for (int i = 0; i < num; i++) {
val = va_arg(v1, int);
printf("%d\n",val);
}
}
int main() {
func1(3, 10, 30, 20);
return 0;
}
v1 = 10
10
30
20