成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C語言中可變參數的使用

開發 后端
究竟如何寫可變參數的C函數以及這些可變參數的函數編譯器是如何實現,這個問題卻一直困擾了我好久。本文就這個問題進行一些探討,希望能對大家有些幫助.

一、什么是可變參數

我們在C語言編程中有時會遇到一些參數個數可變的函數,例如printf()函數,其函數原型為:

 

  1. int printf( const char* format, ...); 

 

它除了有一個參數format固定以外,后面跟的參數的個數和類型是可變的(用三個點“…”做參數占位符),實際調用時可以有以下的形式:

 

  1. printf("%d",i);  
  2. printf("%s",s);  
  3. printf("the number is %d ,string is:%s", i, s); 

 

以上這些東西已為大家所熟悉。但是究竟如何寫可變參數的C函數以及這些可變參數的函數編譯器是如何實現,這個問題卻一直困擾了我好久。本文就這個問題進行一些探討,希望能對大家有些幫助.

二、寫一個簡單的可變參數的C函數

先看例子程序。該函數至少有一個整數參數,其后是占位符…,表示后面參數的個數不定. 在這個例子里,所有的輸入參數必須都是整數,函數的功能是打印所有參數的值.

函數代碼如下:

 

  1. //示例代碼1:可變參數函數的使用  
  2. #include "stdio.h"  
  3. #include "stdarg.h"  
  4. void simple_va_fun(int start, ...)  
  5. {  
  6. va_list arg_ptr;  
  7. int nArgValue =start;  
  8. int nArgCout=0; //可變參數的數目  
  9. va_start(arg_ptr,start); //以固定參數的地址為起點確定變參的內存起始地址。  
  10. do 
  11. {  
  12. ++nArgCout;  
  13. printf("the %d th arg: %d\n",nArgCout,nArgValue); //輸出各參數的值  
  14. nArgValue = va_arg(arg_ptr,int); //得到下一個可變參數的值  
  15. while(nArgValue != -1);  
  16. return;  
  17. }  
  18. int main(int argc, char* argv[])  
  19. {  
  20. simple_va_fun(100,-1);  
  21. simple_va_fun(100,200,-1);  
  22. return 0;  

 

從這個函數的實現可以看到,我們使用可變參數應該有以下步驟:

⑴在程序中將用到以下這些宏:

 

  1. void va_start( va_list arg_ptr, prev_param );  
  2. type va_arg( va_list arg_ptr, type );  
  3. void va_end( va_list arg_ptr ); 

 

va在這里是variable-argument(可變參數)的意思.

這些宏定義在stdarg.h中,所以用到可變參數的程序應該包含這個頭文件.

⑵函數里首先定義一個va_list型的變量,這里是arg_ptr,這個變量是指向參數地址的指針.因為得到參數的地址之后,再結合參數的類型,才能得到參數的值。

⑶然后用va_start宏初始化⑵中定義的變量arg_ptr,這個宏的第二個參數是可變參數列表的前一個參數,也就是***一個固定參數。

⑷然后依次用va_arg宏使arg_ptr返回可變參數的地址,得到這個地址之后,結合參數的類型,就可以得到參數的值。然后進行輸出。

⑸設定結束條件,這里的條件就是判斷參數值是否為-1。注意被調的函數在調用時是不知道可變參數的正確數目的,程序員必須自己在代碼中指明結束條件。至于為什么它不會知道參數的數目,讀者在看完下面這幾個宏的內部實現機制后,自然就會明白。

【編輯推薦】

  1. C 語言對模塊化支持的欠缺
  2. VC++獲得當前系統時間的幾種方案
  3. auto、register、static、extern等存儲類修飾符的區別
  4. 為什么程序員得到的報酬與他們的生產力不成正比
責任編輯:于鐵 來源: 比特網
相關推薦

2021-01-06 05:29:04

C語言參數應用

2011-06-15 10:53:05

C語言

2012-09-18 13:26:39

CC++

2010-01-15 19:17:48

C++語言

2022-01-06 14:25:24

C語言指針內存

2009-06-30 10:46:05

多級指針

2010-08-24 16:00:43

C語言

2021-12-06 11:19:47

語言指針內存

2022-07-27 16:40:25

C語言

2023-12-21 11:46:48

C語言柔性數組開發

2023-10-27 11:21:20

C語言Multics語言

2011-03-30 11:01:13

C語言隨機

2021-06-07 23:19:44

Golang語言 Defer

2021-04-28 09:02:48

Golang語言Context

2010-01-18 13:54:28

函數

2023-12-29 08:27:36

C語言靜態變量開發

2011-08-29 09:19:25

c語言

2010-01-21 15:48:38

C++語言

2010-01-25 17:05:37

C++語言

2022-03-29 08:30:47

指針數組C語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜成人免费视频 | 国产综合区 | 久久久久国产一区二区三区 | wwwsihu| 欧美日韩亚洲国产综合 | 亚洲人在线播放 | 在线婷婷 | 久久综合激情 | av网站推荐 | 欧美专区在线 | 亚洲中国字幕 | 蜜桃在线一区二区三区 | 国产免费一级片 | 国产精品久久久久久二区 | 欧美在线一区二区三区四区 | 欧美一区二区三区在线视频 | 天天综合国产 | 黄色一级电影免费观看 | 黄色片网站在线观看 | 一二三四在线视频观看社区 | 国内精品视频一区二区三区 | 免费看国产一级特黄aaaa大片 | 精品丝袜在线 | 亚洲精品免费观看 | 国产成人精品午夜视频免费 | 久久99精品久久久 | 黑人中文字幕一区二区三区 | 亚洲一区二区在线播放 | 国产探花在线精品一区二区 | 免费观看成人鲁鲁鲁鲁鲁视频 | 精品国产成人 | 天堂影院av | 香蕉久久久久久 | 99精品视频一区二区三区 | 又黑又粗又长的欧美一区 | 国产精品视频二区三区 | 很很干很很日 | 久久久精 | 91精品国产日韩91久久久久久 | 无码一区二区三区视频 | 丁香五月网久久综合 |