可变参数列表详解
如果你還沒懂可變參數列表,那么請認真看完:
printf 就是使用可變參數列表,原型申明為:
int printf(const char *fmt, ...);在看看它的實現:
int printf(const char *fmt, ...){int res;va_list arg;va_start(arg, fmt);res = vprintf(fmt, arg);va_end(arg);return res;}vprintf;在此就不在深究,我們看看 原型中:va_list ? va_start ? va_end 這是幾個定義在<stdarg.h>頭文件中的宏 下面分別看他的用法:
實例:fun(argN,...) (1)va_list? va_list是一個類型,定義一個該類型的變量arg_ptr,可以用該變量作為保存可變參數列表的指針。(2)va_start(arg_ptr, argN)
使參數列表指針arg_ptr指向函數參數列表中的第一個可選參數,argN是位于第一個可選參數之前的固定參數, 或者說最后一個固定參數.如有一va函數的聲明是void va_test(char a, char b, char c, ...), 則它的固定參數依次是a,b,c, 最后一個固定參數argN為c, 因此就是va_start(arg_ptr, c).
(3)va_arg(arg_ptr, type)
返回參數列表中指針arg_ptr所指的參數, 返回類型為type. 并使指針arg_ptr指向參數列表中下一個參數.返回的是可選參數, 不包括固定參數.
(4)va_end(arg_ptr)
清空參數列表, 并置參數指針arg_ptr無效.
(注:va在這里是variable-argument(可變參數)的意思. ? 這些宏定義在stdarg.h中,所以用到可變參數的程序應該包含這個頭文件)
上面已經說的很清楚,為了更加形象:看一個代碼:(功能:打印可變參數表中的所有參數) #include "stdio.h" #include "stdarg.h" void simple_va_fun(int start, ...) {va_list arg_ptr;int nArgValue = start; //可變參數的值int nArgCout = 0; //可變參數的數目 va_start(arg_ptr, start); //以固定參數的地址(start)為起點確定變參的內存起始地址。 do{++nArgCout;nArgValue = va_arg(arg_ptr, int);//得到下一個可變參數的值printf("the %d th arg: %d\n", nArgCout, nArgValue); //輸出各參數的值 } while (nArgValue != -1);va_end(arg_ptr); }int main(int argc, char* argv[]) {//simple_va_fun(100, -1);simple_va_fun(100, 200, 12, 25, 56,-1);return 0; } 在進行參數調用時,會從右到左吧參數壓入到棧中,下面看看上邊例子中的參數入棧情況:
最后再說一點,既然都是參數,上邊的函數只是打印了可變參數,一個函數的固定參數照樣可以在函數中應用,我這里直接省了固定參數的打印,加上的話,調換一下程序中的一個語句: 打印結果: 賜教!
轉載于:https://www.cnblogs.com/li-ning/p/9489980.html
總結
- 上一篇: ASP.NET MVC中controll
- 下一篇: 读《构建之法》第11,12章有感