C语言函数不定参数实现方式
函数如何实现不定参数:
由于在C语言中没有函数重载,解决不定数目函数参数问题变得比较麻烦,即使采用C++,如果参数个数不能确定,也很难采用函数重载。对这种情况 ,提出了指针参数来解决问题。
(1)va_list
定义了一个指针arg_ptr, 用于指示可选的参数.
(2)va_start(arg_ptr, argN) 使参数列表指针arg_ptr指向函数参数列表中的第一个可选参数,argN是位于第一个可选参数之前的固定参数, 或者说最后一个固定参数.如有一va 函数的声明是void va_test(char a, char b, char c, ...), 则它的固定参数依次是a,b,c, 最后一个固定参数argN为c, 因此就是va_start (arg_ptr, c).
(3)va_arg(arg_ptr, type) 返回参数列表中指针arg_ptr所指的参数, 返回类型为type. 并使指针arg_ptr指向参数列表中下一个参数.返回的是可选参数, 不包括固定参数.
(4)va_end(arg_ptr) 清空参数列表, 并置参数指针arg_ptr无效. (注:va在这里是variable-argument(可变参数)的意思. 这些宏定义在stdarg.h中,所以用到可变参数的程序应该包含这个头文件)
以下以几个栗子来说明情况:
例1:
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <stdarg.h>
4
5 int print(const char *format, ...)
6 {
7 va_list args;
8 const char *args1;
9 va_start(args, format);
10 args1 = va_arg(args,const char *);
11 va_end(args);
12 printf("format=%s args1=%s", format, args1);
13 }
14 int main()
15 {
16 print("11111", "22222");
17 }
运行结果:
1 /*
2 format=11111 args1=22222
3 Process returned 24 (0x18) execution time : 0.542 s
4 Press any key to continue.
5 */
例2:
1 例2:
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <stdarg.h>
5
6 int print(const char *format, ...)
7 {
8 va_list args;
9 const char *args1;
10 va_start(args, format);
11 args1 = va_arg(args,const char *);
12 va_end(args);
13 printf("format=%s args1=%s", format, args1);
14 }
15
16 int main()
17 {
18 print("11111", "22222", "333333");
19 }
运行结果:
1 /*
2 format=11111 args1=22222
3 Process returned 24 (0x18) execution time : 0.542 s
4 Press any key to continue.
5 */
我们从上面可以看见这样在函数中加入三个参数是没有问题的;
例3:
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <stdarg.h>
4
5 int print(const char *format, ...)
6 {
7 va_list args;
8 const char *args1;
9 va_start(args, format);
10 args1 = va_arg(args, const char *);
11 args2 = va_arg(args, const char *);
12 va_end(args);
13 printf("format=%s args1=%s", format, args1, args2);
14 }
15
16
17 int main()
18 {
19
20 print("11111", "23333");
21 }
运行结果:
1 /*
2 format=11111 args1=23333
3 Process returned 24 (0x18) execution time : 0.153 s
4 Press any key to continue.
5
6 */
注意是上面并没有三个参数,但是程序还是可以运行起来的!
从上面三个例子可以看出我们传入的参数都是一个类型的参数;
例4:
不同类型的函数参数:
1 int print(const char *format, ...)
2 {
3 va_list args;
4 int args1;
5 va_start(args, format);
6 args1 = va_arg(args, int);
7 va_end(args);
8 printf("format=%s args1=%d", format, args1);
9 }
10
11
12 int main()
13 {
14
15 print("11111", 123);
16 }
运行结果:
1 /*
2 format=11111 args1=123
3 Process returned 22 (0x16) execution time : 0.007 s
4 Press any key to continue.
5 */
但是注意不能使用: 总之,va_arg(ap,type)中的type绝对不能为以下类型: ——char、signed char、unsigned char ——short、unsigned short ——signed short、short int、signed short int、unsigned short int ——float
- 使用bash编写Linux shell脚本--复合命令
- 【web必知必会】—— 使用DOM完成属性填充
- 进程控制实验--fork()
- 编写兼容性JS代码
- msysGit管理GitHub代码
- 【web必知必会】—— DOM:四个常用的方法
- TortoiseSVN与VisualSVN Server搭建SVN版本控制系统
- 【SVN多用户开发】代码冲突&解决办法
- 【AngularJS】—— 13 服务Service
- 【AngularJS】—— 12 独立作用域
- 【AngularJS】—— 11 指令的交互
- 使用DOM动态创建标签
- Eclipse配置Tomcat,访问404错误
- 【AngularJS】—— 9 自定义过滤器
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP7创建销毁session的实例方法
- Vim如何使用相对行号实现一切操作详解
- laravel 框架执行流程与原理简单分析
- 对python自动生成接口测试的示例讲解
- 解决pip install xxx报错SyntaxError: invalid syntax的问题
- PHP如何使用JWT做Api接口身份认证的实现
- 解决python3 Pycharm上连接数据库时报错的问题
- php把文件设置为插件的技巧方法
- Python中fnmatch模块的使用详情
- tp5框架使用cookie加密算法实现登录功能示例
- python实现停车管理系统
- 浅谈Pycharm调用同级目录下的py脚本bug
- Python中logging.NullHandler 的使用教程
- Python中利用aiohttp制作异步爬虫及简单应用
- Linux内核设备驱动之系统调用笔记整理