關於C語言可變引數函式的寫法及其應用
阿新 • • 發佈:2018-12-17
以前一直以為C語言的函式都是精確匹配的,直到看了 C和C指標 才知道還有可變引數的函式。仔細一想,平時最常用的printf ,scanf 不就是可變引數的嗎。 先上程式碼,隨後詳細講解可變引數函式的用法。
#include<stdio.h> #include<stdarg.h> void fun(int num, ...) { int i; int res = 0; va_list v1; //v1實際是一個字元指標,從標頭檔案裡可以找到 va_start(v1, num); //使v1指向可變列表中第一個值,即num後的第一個引數 printf("*v = %d\n",*v1); for(i = 0; i < num-1; i++) //num 減一是為了防止下標超限 { res = va_arg(v1, int); //該函式返回v1指向的值,並是v1向下移動一個int的距離,使其指向下一個int printf("res = %d, *v1 = %d\n",res, *v1); } va_end(v1); //關閉v1指標,使其指向null } int main(void) { fun(4,1,2,3,4); return 0; }
這個函式簡單的介紹了可變引數函式的用法。 首先,必須包含stdarg.h 標頭檔案,我們用到的東西,都在這個標頭檔案中。包括 va_list,va_start,va_arg, va_end。 va_list 用於定義一個指向引數的指標,其實就是一個char* 的指標。 va_start(v1, num); 將v1指標指向可變引數的第一個引數。通過列印*v1可知,打印出來的是,1 ,正是第一個可變引數。 res = va_arg(v1, int); 這個函式返回v1指標所指的值,並使v1指標 移動sizeof(int) = 4, 個位元組,使其指向下一個引數。注意,當引數型別為char 時,應該寫char, 以此類比。 va_end