免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

如何解析可變參數函數的實現原理-創新互聯

本篇文章給大家分享的是有關如何解析可變參數函數的實現原理,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

創新互聯建站10多年成都企業網站定制服務;為您提供網站建設,網站制作,網頁設計及高端網站定制服務,成都企業網站定制及推廣,對成都主動防護網等多個行業擁有多年的網站營銷經驗的網站建設公司。

學習C的語言的時候,肯定接觸到標準輸出和標準輸入函數。

這個函數給人的感覺很強大,因為它很另類,就是這個函數的參數是可變的。

下面是一個自己編寫的可變參數的函數,它的功能是求和。如下

#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;
}

程序如上,注意以下幾點就可以編寫可變參數的函數了。

1.聲明

int sum(int data,...)

它的末尾是以...結束的,表示是可變參數函數。

2.正確使用

va_list

va_start,va_arg,va_end

如上,就可以編寫可變參數函數了。

不過大多數初級學者可能對

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,它的定義是

類似的。

不過本文關鍵是說實現的原理:

首先在你調用一個可變參數函數時,例如

上面的

int s=sum(1,2,3,4,5,-1);

這個函數,編譯器會在內存中分配空間存儲這些參數。

根據編譯器中從右至左的順序把參數壓棧。

這里的棧就是常說的存儲局部變量和函數參數的內存空間。

這塊內存空間是連續的。

因此我們只要能找到這塊內存空間的首地址就可以了。然后每讀一個參數,就加上這個參數在內存空間中占

的大小,就是下一個參數的內存地址,就這樣依次就可以得到每一個參數。

下面說下每個標識的含義

1,va_list 就是一個char* 指針,用來記錄這個參數列表在內存中地址。


2,va_start()

例如:va_start(vl,data);這個宏是得到參數列表中第2個參數內存地址。

至于為什么不是第一個,這和寫編譯器的程序員有關,因為它的宏定義,就是說明這個vl,注(vl就是va_list)

指向的就是第2個參數。

如何解析可變參數函數的實現原理

如上,v就是第一個參數,ap就是va_list的變量,例如上面的

va_start(vl,data);

很明顯它先得到第一個參數內存地址,然后又加上這個參數的內存大小,就是下個參數的內存地址。

注:因為第一個參數,參數列表中已經給出,所以它得到的是第2個參數的內存地址。

3,va_arg

這個宏的意思,就是取得當前vl所指的參數,并且vl加上這個參數大小,指向下一個參數。

它的定義,明顯說明了這個問題。

如何解析可變參數函數的實現原理


它先加上參數類型t的大小,然后,在減去,參數類型t的大小,然后作強制類型轉換(t*),所以t一定要是類

型,不是變量。然后取*得到改地址指向的內存中的數據。

例如實例中的

i=va_arg(vl,int);


第一次調用的時候,它得到就是參數列表中第二個參數的值。

下面依次調用就可以得到第三個,第四個參數的值。。。

4,va_end
這個宏,就比較簡單了。

就是把指針值歸0.讓它指向NULL。

也就是一個指針不用了,就會把它賦值為NULL.

如何解析可變參數函數的實現原理
如上明先可以看到

這個宏就是一個賦值語句。

ap=(char*)0;//va_list 就是cha*的別名。

其實只要把4個標識

va_list

va_start,va_arg,va_end

的意思記住了,就可以編寫可變參數的函數。

使用的主要注意

va_start(ap,v)

v是第一個參數。

va_arg(ap,t)

t是你要取得的參數類型。

va_end(ap)

就是把指針ap賦值為0,使他不指向內存的變量。

ap

就是

va_list的一個變量。也就是一個

char *類型的變量。

到此,我想你應該對可變參數函數的實現原理有了一定的了解,起碼應該有了形象的了解吧。

coder:huifeng00

以上就是如何解析可變參數函數的實現原理,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注創新互聯行業資訊頻道。

文章名稱:如何解析可變參數函數的實現原理-創新互聯
文章分享:http://m.newbst.com/article42/dgiphc.html

成都網站建設公司_創新互聯,為您提供服務器托管虛擬主機小程序開發網站維護商城網站電子商務

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

商城網站建設