1:当无法列出传递函数的所有实参的类型和数目时,可用省略号指定参数表void foo(...);
void foo(parm_list,...);

2:函数参数的传递原理
函数参数是以数据结构:栈的形式存取,从右至左入栈.eg:

 1 #include <iostream>  
 2 void fun(int a, 
 3 { 
 4 int *temp = &a; 
 5 temp++; 
 6 for (int i = 0; i < a; ++i) 
 7 { 
 8 cout << *temp << endl; 
 9 temp++; 
10 } 
11 } 
12 
13 int main() 
14 { 
15 int a = 1; 
16 int b = 2; 
17 int c = 3; 
18 int d = 4; 
19 fun(4, a, b, c, d); 
20 system("pause"); 
21 return 0; 
22 } 

Output:: 



4

3:获取省略号指定的参数
在函数体中声明一个va_list,然后用va_start函数来获取参数列表中的参数,使用完毕后调用va_end()结束。像这段代码:

1 void TestFun(char* pszDest, int DestLen, const char* pszFormat, 
2 { 
3 va_list args; 
4 va_start(args, pszFormat); 
5 _vsnprintf(pszDest, DestLen, pszFormat, args); 
6 va_end(args); 
7 }

4.va_start使argp指向第一个可选参数。va_arg返回参数列表中的当前参数并使argp指向参数列表中的下一个参数。va_end把argp指针清为NULL。函数体内可以多次遍历这些参数,但是都必须以va_start开始,并以va_end结尾。

1).演示如何使用参数个数可变的函数,采用ANSI标准形式

 1 #include 〈stdio.h〉 
 2   #include 〈string.h〉 
 3   #include 〈stdarg.h〉 
 4   /*函数原型声明,至少需要一个确定的参数,注意括号内的省略号*/ 
 5   int demo( char,  ); 
 6   void main( void ) 
 7   { 
 8    demo("DEMO", "This", "is", "a", "demo!", ""); 
 9   } 
10   /*ANSI标准形式的声明方式,括号内的省略号表示可选参数*/ 
11   int demo( char �msg,  ) 
12   { 
13   /*定义保存函数参数的结构*/
14    va_list argp; 
15    int argno = 0;  
16    char para; 
17 
18    /*argp指向传入的第一个可选参数,msg是最后一个确定的参数*/ 
19    va_start( argp, msg ); 
20    while (1) 
21   { 
22    para = va_arg( argp, char); 
23    if ( strcmp( para, "") == 0 ) 
24   break; 
25    printf("Parameter #%d is: %s\n", argno, para); 
26    argno++; 
27    } 
28    va_end( argp ); 
29    /*将argp置为NULL*/
30    return 0; 
31   } 

2)//示例代码1:可变参数函数的使用

 1 #include "stdio.h"
 2 #include "stdarg.h"
 3 void simple_va_fun(int start, 
 4 { 
 5   va_list arg_ptr; 
 6   int nArgValue =start;
 7   int nArgCout=0; //可变参数的数目
 8   va_start(arg_ptr,start); //以固定参数的地址为起点确定变参的内存起始地址。
 9   do
10   {
11   ++nArgCout;
12   printf("the %d th arg: %d\n",nArgCout,nArgValue); //输出各参数的值
13   nArgValue = va_arg(arg_ptr,int); //得到下一个可变参数的值
14   } while(nArgValue != -1);  
15   return; 
16 }
17 int main(int argc, char* argv[])
18 {
19   simple_va_fun(100,-1); 
20   simple_va_fun(100,200,-1); 
21   return 0;
22 }

3)//示例代码2:扩展——自己实现简单的可变参数的函数。
下面是一个简单的printf函数的实现,参考了<The C Programming Language>中的例子

 1 #include "stdio.h"
 2 #include "stdlib.h"
 3 void myprintf(char* fmt, ) //一个简单的类似于printf的实现,//参数必须都是int 类型
 4 { 
 5   char* pArg=NULL; //等价于原来的va_list 
 6   char c;
 7    
 8   pArg = (char*) &fmt; //注意不要写成p = fmt !!因为这里要对//参数取址,而不是取值
 9   pArg += sizeof(fmt); //等价于原来的va_start  
10  
11   do
12   {
13   c =*fmt;
14   if (c != '%')
15   {
16   putchar(c); //照原样输出字符
17   }
18   else
19   {
20   //按格式字符输出数据
21   switch(*++fmt) 
22   {
23   case'd':
24   printf("%d",*((int*)pArg));  
25   break;
26   case'x':
27   printf("%#x",*((int*)pArg));
28   break;
29   default:
30   break;
31   } 
32   pArg += sizeof(int); //等价于原来的va_arg
33   }
34   ++fmt;
35   }while (*fmt != '\0'); 
36   pArg = NULL; //等价于va_end
37   return; 
38 }
39 int main(int argc, char* argv[])
40 {
41   int i = 1234;
42   int j = 5678;
43    
44   myprintf("the first test:i=%d\n",i,j); 
45   myprintf("the secend test:i=%d; %x;j=%d;\n",i,0xabcd,j); 
46   system("pause");
47   return 0;
48 }

转载于:https://www.cnblogs.com/phonefans/archive/2008/12/24/1361635.html

va_start() va_end()函数应用相关推荐

  1. va_start(),va_end()函数应用

    原理解释: VA_LIST 是在C语言中解决变参问题的一组宏,在<stdarg.h>头文件下. VA_LIST的用法:             (1)首先在函数里定义一具VA_LIST型的 ...

  2. C语言 va_start / va_end / va_arg 自定义 printf 函数 - C语言零基础入门教程

    目录 一.前言 二.函数不定长参数简介 1.va_start 2.va_arg 3.va_end 三.win32 控制台版本 四.MFC 对话框版本 五.猜你喜欢 零基础 C/C++ 学习路线推荐 : ...

  3. 可变参数列表(va_list,va_arg,va_copy,va_start,va_end)

    本文转自:http://blog.csdn.net/costa100/article/details/5787068 va_list arg_ptr:定义一个指向个数可变的参数列表指针: va_sta ...

  4. va_list/va_start/va_end的使用

    va_list 键入以保存有关变量参数的信息 va_start 初始化变量参数列表 初始化ap以检索参数paramN后面的附加参数. 调用va_start的函数在返回之前也应调用va_end. 参数不 ...

  5. va_list va_start va_end的使用

    <pre name="code" class="cpp" style="color: rgb(51, 51, 51); white-space: ...

  6. [zz]va_start() 和 va_end()函数应用

    man:        #include <stdarg.h> void va_start(va_list ap, last);        type va_arg(va_list ap ...

  7. 对va_list; va_start ; va_end ;vsprintf理解(转)

    以下为转载内容: 1 int printf(const char* fmt, ...) 2 { 3 va_list args; 4 int i; 5 //1.将变参转化为字符串 6 va_start( ...

  8. vsnprintf va_list va_start va_end

    1.函数原型: int vsnprintf(char *str, size_t size, const char *format, va_list ap); 某度百科: _vsnprintf是C语言库 ...

  9. va_list函数族应用

    va_start()va_end()函数应用: man:        #include <stdarg.h> void va_start(va_list ap, last);       ...

最新文章

  1. js的eval函数解析后台返回的json数据时为什加上圆括号eval((+data+)),而HTML页面定义的数据不用...
  2. wamp如何更改网站根目录DocumentRoot
  3. Hibernate一对一关联映射配置
  4. 【机器学习算法-python实现】决策树-Decision tree(2) 决策树的实现
  5. 加载pdf_Java 插入附件到PDF文档
  6. RDIFramework.NET V2.9版本多语言的实现
  7. php cookie expires,php cookie类(设置、获取、删除cookie值)
  8. 《构建之法》阅读笔记01
  9. C++primer第八章 IO库 8.3string流
  10. 定理在数学中的简写形式_湘教版八年级数学上册知识点总结
  11. vuex express mysql_基于Vue2.0+Vuex+Axios+NodeJs+Express+MySQL实现京东移动web商城
  12. Lync Server 2013 安装准备工具 for Win 2008 R2
  13. Linux 磁盘与文件系统
  14. LeetCode() Search in Rotated Sorted Array
  15. 手把手教你提取WOW中的所有声音文件
  16. 计算机技术作文500字初一,初一关于那一刻的作文500字(精选10篇)
  17. 矩阵 LUP 分解 解线性方程组 求行列式值 矩阵求逆 算法说解
  18. 鸿蒙笔记本双系统,经验:巧用固态硬盘给笔记本电脑安装双系统
  19. 摄影构图学83年绝版_摄影到底是一门技术还是艺术?在摄影创作中,如何提高审美意境?...
  20. 京东大图在服务器哪个文件夹,京东图片管理在哪里?怎么使用?

热门文章

  1. 用法 stl_51Nod 2160 数字游戏 STL基本用法
  2. php写一个shell脚本文件格式,一篇文章学会——shell脚本编写
  3. 【PostgreSQL】行变列、非空(CASE WHEN、COALESCE)语句总结
  4. QT:(4)解决在VS15下配置QT后没有QT GUI Application选项
  5. Python Qt GUI设计:QSpinBox计数器类(基础篇—15)
  6. 一文看懂Modbus协议
  7. archlinux升级内核后virtualbox不能启动虚拟机
  8. 【YOLOV4】(7) 特征提取网络代码复现(CSPDarknet53+SPP+PANet+Head),附Tensorflow完整代码
  9. 【机器视觉案例】(5) AI视觉,远程手势控制虚拟计算器,附python完整代码
  10. Matlab实现 sift 特征匹配(代码源自网络)