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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏乐百川的学习频道

Python 正则表达式

最近研究Python爬虫,很多地方用到了正则表达式,但是没好好研究,每次都得现查文档。今天就专门看看Python正则表达式。本文参考了官方文档 re模块。 模式...

19310
来自专栏lgp20151222

Java函数的传参机制

最近的一个项目,里面各种返回void,参数用引用类型,那叫一个熟和多,但是也把我绕糊涂了。

602
来自专栏C语言及其他语言

结构体与共用体

1、结构体的定义和使用 前面我们已经讨论过字符数组与字符串,字符指针也可以指向一个字符串,可以用字符串常量对字符 指针进行初始化。例如: char *str...

3117
来自专栏闻道于事

Java之数据类型,变量赋值

Java中的基础数据类型(四类八种):   1.整数型     byte----使用byte关键字来定义byte型变量,可以一次定义多个变量并对其进行赋值...

2845
来自专栏企鹅号快讯

Python中的while循环

原创第13篇~while循环 阅读本文大概15分钟。 文章‍结构: while定义 普通while练习 while和input函数 while 和 else w...

2166
来自专栏我爱编程

Day6函数式编程2/3

返回函数 函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。 实现一个可变参数的求和。 def lazy_sum(*args):...

3366
来自专栏散尽浮华

Python进阶-面向对象

类的成员 类的成员可以分为三类:字段、方法、属性 一:字段: 普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同 普通字段属于...

1677
来自专栏java学习

Java每日一练(2017/7/7)

1 (单选题)有以下程序片段,下列哪个选项不能插入到行 1 。()。 1. 2.public class A{ 3.//do sth 4. } A publ...

31711
来自专栏章鱼的慢慢技术路

用数组解决问题(一)

1644
来自专栏和蔼的张星的图像处理专栏

162. 矩阵归零先找为零的位置,再分别置零

给定一个m×n矩阵,如果一个元素是0,则将其所在行和列全部元素变成0。 需要在原矩阵上完成操作。

701

扫描关注云+社区