本篇文章給大家分享的是有關如何解析可變參數(shù)函數(shù)的實現(xiàn)原理,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
成都創(chuàng)新互聯(lián)專注于網站建設|成都網站維護|優(yōu)化|托管以及網絡推廣,積累了大量的網站設計與制作經驗,為許多企業(yè)提供了網站定制設計服務,案例作品覆蓋發(fā)電機維修等行業(yè)。能根據(jù)企業(yè)所處的行業(yè)與銷售的產品,結合品牌形象的塑造,量身定制品質網站。
學習C的語言的時候,肯定接觸到標準輸出和標準輸入函數(shù)。
這個函數(shù)給人的感覺很強大,因為它很另類,就是這個函數(shù)的參數(shù)是可變的。
下面是一個自己編寫的可變參數(shù)的函數(shù),它的功能是求和。如下
#include <stdio.h>
#include <stdarg.h>
int sum(int data,...)
{
int i=data,s=0;
va_list vl;
va_start(vl,data);
while(i!=-1)
{
s+=i;
i=va_arg(vl,int);
}
va_end(vl);
return s;
}
int main()
{
int s=sum(1,2,3,4,5,-1);
printf("sum = %d\n",s);
return 0;
}
程序如上,注意以下幾點就可以編寫可變參數(shù)的函數(shù)了。
1.聲明
int sum(int data,...)
它的末尾是以...結束的,表示是可變參數(shù)函數(shù)。
2.正確使用
va_list
va_start,va_arg,va_end
如上,就可以編寫可變參數(shù)函數(shù)了。
不過大多數(shù)初級學者可能對
va_list
va_start,va_arg,va_end
望而卻步,認為他們很神秘。
其實他們也是很基礎的C知識,只是被包裝了。
C中包裝的方法,有 typedef,#define
例如你把int包裝成ID
typedef int ID;
其實
va_list
va_start,va_arg,va_end
他們也是包裝得到的。
va_list 就是一個指針類型。
va_start,va_arg,va_end,就是3個宏。
下面給出它們在C中的源碼
如上你可以在頭文件stdarg.h中查到,本文是針對VC6.0來說的,高版本的編譯器,在vadefs.h,它的定義是
類似的。
不過本文關鍵是說實現(xiàn)的原理:
首先在你調用一個可變參數(shù)函數(shù)時,例如
上面的
int s=sum(1,2,3,4,5,-1);
這個函數(shù),編譯器會在內存中分配空間存儲這些參數(shù)。
根據(jù)編譯器中從右至左的順序把參數(shù)壓棧。
這里的棧就是常說的存儲局部變量和函數(shù)參數(shù)的內存空間。
這塊內存空間是連續(xù)的。
因此我們只要能找到這塊內存空間的首地址就可以了。然后每讀一個參數(shù),就加上這個參數(shù)在內存空間中占
的大小,就是下一個參數(shù)的內存地址,就這樣依次就可以得到每一個參數(shù)。
下面說下每個標識的含義
1,va_list 就是一個char* 指針,用來記錄這個參數(shù)列表在內存中地址。
2,va_start()
例如:va_start(vl,data);這個宏是得到參數(shù)列表中第2個參數(shù)內存地址。
至于為什么不是第一個,這和寫編譯器的程序員有關,因為它的宏定義,就是說明這個vl,注(vl就是va_list)
指向的就是第2個參數(shù)。
如上,v就是第一個參數(shù),ap就是va_list的變量,例如上面的
va_start(vl,data);
很明顯它先得到第一個參數(shù)內存地址,然后又加上這個參數(shù)的內存大小,就是下個參數(shù)的內存地址。
注:因為第一個參數(shù),參數(shù)列表中已經給出,所以它得到的是第2個參數(shù)的內存地址。
3,va_arg
這個宏的意思,就是取得當前vl所指的參數(shù),并且vl加上這個參數(shù)大小,指向下一個參數(shù)。
它的定義,明顯說明了這個問題。
它先加上參數(shù)類型t的大小,然后,在減去,參數(shù)類型t的大小,然后作強制類型轉換(t*),所以t一定要是類
型,不是變量。然后取*得到改地址指向的內存中的數(shù)據(jù)。
例如實例中的
i=va_arg(vl,int);
第一次調用的時候,它得到就是參數(shù)列表中第二個參數(shù)的值。
下面依次調用就可以得到第三個,第四個參數(shù)的值。。。
4,va_end
這個宏,就比較簡單了。
就是把指針值歸0.讓它指向NULL。
也就是一個指針不用了,就會把它賦值為NULL.
如上明先可以看到
這個宏就是一個賦值語句。
ap=(char*)0;//va_list 就是cha*的別名。
其實只要把4個標識
va_list
va_start,va_arg,va_end
的意思記住了,就可以編寫可變參數(shù)的函數(shù)。
使用的主要注意
va_start(ap,v)
v是第一個參數(shù)。
va_arg(ap,t)
t是你要取得的參數(shù)類型。
va_end(ap)
就是把指針ap賦值為0,使他不指向內存的變量。
ap
就是
va_list的一個變量。也就是一個
char *類型的變量。
到此,我想你應該對可變參數(shù)函數(shù)的實現(xiàn)原理有了一定的了解,起碼應該有了形象的了解吧。
coder:huifeng00
以上就是如何解析可變參數(shù)函數(shù)的實現(xiàn)原理,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
當前文章:如何解析可變參數(shù)函數(shù)的實現(xiàn)原理
網站路徑:http://chinadenli.net/article4/pipdoe.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供品牌網站設計、定制網站、靜態(tài)網站、品牌網站建設、網站制作、營銷型網站建設
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)