我最近對可變參數列表十分感興趣,因為它可以接受不同數目的參數。讓我們先看一下它的聲明:
成都創新互聯公司-專業網站定制、快速模板網站建設、高性價比長嶺網站開發、企業建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式長嶺網站制作公司更省心,省錢,快速模板網站建設找我們,業務覆蓋長嶺地區。費用合理售后完善,10年實體公司更值得信賴。void printf (const char *format,...)
我們通過一個具體的例子來理解它:
#include <stdio.h> #include <stdarg.h> int average (int val, ...) { int i = 0; int sum = 0; va_list arg;//定義了一個char 類型的指針 va_start(arg,val);//讀取所有的參數,從頭開始,后讀取你所給的參數個數,并且把參數放到指針中 for (i = 0; i < val; i++) { sum += va_arg(arg,int); } va_end(arg);//結束讀取 return sum / val; } int main() { int ret = 0; ret = average(5,1,2,3,4,5); printf("%d\n",ret); return 0; }
可變參數列表是通過宏-stdarg來實現的,這個頭文件中聲明了一個類型va_list和三個宏va_start,va_arg,va_end,通過右擊并轉到定義處,我們可以發現va_list其實就是一個char *的重命名,函數中是這樣寫的,typedef char * va_list,這就非常好理解了;對于va_start,va_arg和va_end三個宏我們分別轉到定義處可以發現va_start其實是這樣的:,而_crt_va_start依然是由define定義的標識符,其實應該是這樣( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) );而va_arg和va_start類似也是由define定義的標識符,它的原型應該是這樣的:#define _crt_va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ),ap就是指向我的可變參數列表中的第一個參數,通過它可以找到之后的參數;對于va_end它的原型應該是這樣的#define _crt_va_end(ap) ( ap = (va_list)0 ),用于結束va_list說指向的參數列表,當訪問完最后一個可變參數之后,我們就需要調用va_end來結束指向的參數列表
另外有需要云服務器可以了解下創新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
網站欄目:可變參數列表-創新互聯
轉載源于:http://m.newbst.com/article2/coeeoc.html
成都網站建設公司_創新互聯,為您提供品牌網站設計、網站內鏈、虛擬主機、網站設計、網站排名、全網營銷推廣
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯