c可變參數

本文為個人學習筆記,僅供個人學習、復習使用。
參考鏈接:鏈接1、鏈接2

在c語言中,我們可以定義這樣的函數,函數帶有可變數量的參數。

int func(int num,...){
.
.
.
}
int main(){func(2,2,3);
}

1、要注意定義函數時函數的形式;
c語言中的printf()函數其實也是一個可變參數函數,它的原型如下:
int printf(const char *format,...);
c語言之所以可以支持可變參數函數,一個重要的原因是c調用規范中規定c語言函數調用時,參數是從右向左壓入棧的;這樣一個函數實現的時候,就無需關心調用他的函數會傳遞幾個參數過來,而只要關心自己用到幾個。如printf()函數:
printf("%d%s\n",i,s);

printf()函數在定義的時候,不知道函數調用的時候回傳遞幾個參數,在實現上,printf()函數只關心第一個參數,即字符串"%d"s\n",當讀到%d的時候,printf()知道自己需要第二個參數,這時只需要去棧上尋找即可,當讀到%s的時候,再去棧上尋找一個參數即可,也就是說printf()函數不關心棧上到底壓了多少參數,只關心自己需要多少。
如何實現可變參數函數呢?

2、要包含頭文件<stdarg.h>,并注意釋放內存。

1、定義一個函數,最后一個參數為省略號,省略號前面可以設置自定義參數。
2、在函數定義中創建一個va_list類型變量,該類型是在stdrag.h頭文件中定義

3、使用int參數和va_start宏來初始化va_list變量為一個參數列表,宏va_start是在stdarg.h頭文件中定義的。
4、使用va_arg宏和va_list變量來訪問參數列表中的每個項。
5、使用宏va_end來清理va_list變量的內存。

eg:

#include<stdio.h>
#include<stdarg.h>double average(int num,...){va_list valist;double sum=0.0;int i;va_start(valist,num);for(i=0;i<num;i++){sum+=va_arg(valist,int);}va_end(valist);return sum/num;
}int main(){printf("Average of 2,3,4,5=%f\n",average(4,2,3,4,5));printf("Average of 5,10,15=%f\n",average(3,5,10,15));return 0;
}
宏va_list、va_arg、va_end定義在stdarg.h中,原型如下:
void va_start(va_list ap,last);
//取第一個可變參數的指針給ap,last是函數聲明中的最后一個固定參數
type va_arg(va_list ap,type);
//返回當前ap指向的可變參數的值,然后ap指向下一個可變參數;type表示當前可變參數的類型,支持的類型為int和double
void va_end(va_list ap);
//將ap置為null

這里要注意一點va_arg()函數的第二個參數不能被指定為char、short、或float。
char、short會被提升為int,而float會被提升為double。(這里涉及到整數提升的問題,可百度整數提升四個字了解)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376006.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376006.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376006.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

dz打不開plugin. php,Discuz!應用中心打不開空白的解決方法

近期&#xff0c;很多使用Discuz!程序建論壇的站長都會發現&#xff0c;Discuz!后臺的應用中心打不開了。這二天Discuz!終于給出了原因&#xff1a;十分抱歉的通知您&#xff0c;由于資源和人力投入問題&#xff0c;我們已經關閉了 www.discuz.net 的發言權限&#xff0c;但是歷…

編程習題05

1、給定一個數組a[N],我們希望構造數組b[N]&#xff0c;其中b[i]a[0]*a[1]*...*a[N-1]/a[i]。在構造過程&#xff1a;不允許使用除法&#xff1b;要求O(1)空間復雜度和O(n)時間復雜度&#xff1b;除遍歷計數器與a[N] b[N]外&#xff0c;不可使用新的變量(包括棧臨時變量、對空間…

ECshop安裝及報錯解決方案總結

一、安裝ECshop ECShop是一款B2C獨立網店系統 &#xff0c;適合企業及個人快速構建個性化網上商店。系統是基于PHP語言及MYSQL數據庫構架開發的跨平臺開源程序。2006年3月推出以來1.0版以來&#xff0c;受到市場的檢驗&#xff0c;廣受好評。 1.安裝準備 ECshop最新版本為2.7.3…

Command mysql 中文,MySQL Command Line[mysql命令行常用命令]_MySQL

bitsCN.comMySql下載地址&#xff1a;www.mysql.org第一招、mysql服務的啟動和停止net stop mysqlnet start mysql第二招、登陸mysqlmysql -u用戶名-p用戶密碼mysql -uroot -p&#xff0c; 回車後提示你輸入密碼&#xff0c;輸入12345&#xff0c;然後回車即可進入到mysql中了&…

setTimeout里如果有$(this),$(this)指的是誰?

$(".next").click(function(){ setTimeout(function(){$(this).addClass("gray");//指向的是window 而不是$(".next") },1000); })轉載于:https://www.cnblogs.com/xchlsl/p/4484762.html

數據結構--數組實現線性表

線性表&#xff1a;由同類型數據元素構成的有序序列的線性結構 編譯環境&#xff1a;Dev-C 結構實現&#xff1a; struct LNode {ElementType Data[MAXSIZE];int last; }; 主要操作函數&#xff1a; List MakeEmpty();//初始化一個空表ElementType FindKth(int k, List L);//根…

Codeforces Round #241 (Div. 2) A. Guess a number!

題目鏈接 題意 &#xff1a; 就是猜數游戲&#xff0c;根據給定的操作&#xff0c;讓你輸出一個符合條件的。 思路 &#xff1a; 這個題好玩兒&#xff0c;設置兩個變量&#xff0c;一個找符合條件的數的上限&#xff0c;一個找下限&#xff0c;再判斷一下。 1 #include <st…

php中嵌套調用的原理,嵌套調用

## 嵌套調用- 模塊與模塊之間的相互調用(相對路徑)- 項目和項目之間的相互調用(絕對路徑)- 也可以寫一個通用模塊就可以大面積使用&#xff0c;減少代碼維護成本- 或許可以實現一些神奇的效果#### 示例代碼設置文件/html/www/demo/tpl/tpl.blade.php內容如下~~~這是最頂端模塊{…

SET-UID程序漏洞實驗

20125102 一、實驗描述 Set-UID 是Unix系統中的一個重要的安全機制。當一個Set-UID程序運行的時候&#xff0c;它被假設為具有擁有者的權限。例如&#xff0c;如果程序的擁有者是root&#xff0c;那么任何人運行這個程序時都會獲得程序擁有者的權限。Set-UID允許我們做許多很有…

統計文件中有多少個單詞amp;c語言實現

假設文件中的單詞都是字母的組合&#xff0c;且單詞間用空格或者“."區分。實驗環境&#xff1a;Dev-C#include<stdio.h> #include<stdlib.h>int main(){FILE *fp;int i;int fr;long fsize;int word0;int sum0;char filename[20];char *buffer;printf("要…

oracle mul,匯編語言乘指令 MUL、IMUL的具體使用

MUL: 無符號乘;影響 OF、CF 標志位;指令格式:;MUL r/m ;參數是乘數;如果參數是 r8/m8, 將把 AL 做乘數, 結果放在 AX;如果參數是 r16/m16, 將把 AX 做乘數, 結果放在 EAX;如果參數是 r32/m32, 將把 EAX 做乘數, 結果放在 EDX:EAX當乘積的高半部分(AH、DX、EDX、RDX)中存有結…

java實驗二

課程&#xff1a;Java程序設計 班級&#xff1a; 1352 姓名&#xff1a;黃衛   學號&#xff1a;20135221 成績&#xff1a; 指導教師&#xff1a;婁嘉鵬 實驗日期&#xff1a;2015.05.05 實驗密級&#xff1a; 預…

兩數之和c語言實現

題目描述&#xff1a;給定一個整數數組和一個目標值&#xff0c;找出數組中和為目標值的兩個數。你可以假設每個輸入只對應一種答案&#xff0c;且同樣的元素不能被重復利用。示例:給定 nums [2, 7, 11, 15], target 9因為 nums[0] nums[1] 2 7 9 所以返回 [0, 1]解題思路…

【Linux】正確的關機方法

1&#xff09;shutdown命令 我們較常使用的是shutdown這個命令&#xff0c;這個命令可以安全地關閉或重啟Linux系統&#xff0c;它在系統關閉之前給系統上的所有登錄用戶提示一條警告信息。該命令還允許用戶指定一個時間參數&#xff0c;可以是一個精確的時間&#xff0c;也可以…

oracle 存儲過程寫文件,Oracle寫本地文件

Oracle寫本地文件是指寫到運行Oracle的主機上&#xff0c;而不是運行該腳本的機器上。說起來有點拗口&#xff0c;實際上就是無論在哪里執行這個過程&#xff0c;生成的文件始終都是在服務器上的。下面過程實現了這個功能&#xff1a;logdir是指文件存放路徑。有Oracle的direct…

兩數相加c語言實現

給定兩個非空鏈表來表示兩個非負整數。位數按照逆序方式存儲&#xff0c;它們的每個節點只存儲單個數字。將兩數相加返回一個新的鏈表。你可以假設除了數字 0 之外&#xff0c;這兩個數字都不會以零開頭。示例&#xff1a;輸入&#xff1a;(2 -> 4 -> 3) (5 -> 6 -&g…

jQuery獲取Select選擇的Text和Value

一、 jQuery獲取Select選擇的Text和Value:語法解釋&#xff1a; $("#select_id").change(function(){//code...}); //為Select添加事件&#xff0c;當選擇其中一項時觸發varcheckText$("#select_id").find("option:selected").tex…

jquery實現導航欄鼠標點擊后實行背景高亮,點擊離開恢復(超級簡單!!!!)...

昨天才寫了一個方法&#xff0c;今天發現一個更簡單的。 html&#xff1a; <!DOCTYPE html> <html> <head lang"en"><meta charset"UTF-8"><title></title> </head> <body> <div class"dianji&qu…

Linux怎么處理binray文件,Linux下如何反匯編arm raw binary文件

有一個arm elf文件經過objcopy -O binary 命令處理生成bin文件進行反匯編:指令1&#xff1a;arm_v5t_le-objdump -b binary -m armv5te -D u-boot.bin|head指令2&#xff1a;arm-linux-objdump -D -b binary test.bin --architecturearm > /tmp/raw.txthttp://linux.chi…

putty連虛擬機中Linux出現Access Denied

環境&#xff1a;VMwarekali Linux出現這個問題&#xff0c;肯定是你想嘗試直接通過使用root賬戶連接你的linux&#xff0c;這樣肯定是不行的&#xff0c;why&#xff1f;為了保證服務器安全&#xff0c;幾乎所有的服務器都禁止了超級用戶直接登錄系統&#xff0c;而是通過普通…