函数如何实现不定参数:由于在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:

 #include <stdio.h>
#include <stdlib.h>
#include <stdarg.h> int print(const char *format, ...)
{
va_list args;
const char *args1;
va_start(args, format);
args1 = va_arg(args,const char *);
va_end(args);
printf("format=%s args1=%s", format, args1);
}
int main()
{
print("", "");
}

运行结果:

 /*
format=11111 args1=22222
Process returned 24 (0x18) execution time : 0.542 s
Press any key to continue.
*/

例2:

 例2:
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h> int print(const char *format, ...)
{
va_list args;
const char *args1;
va_start(args, format);
args1 = va_arg(args,const char *);
va_end(args);
printf("format=%s args1=%s", format, args1);
} int main()
{
print("", "", "");
}

运行结果:

 /*
format=11111 args1=22222
Process returned 24 (0x18) execution time : 0.542 s
Press any key to continue.
*/

我们从上面可以看见这样在函数中加入三个参数是没有问题的;

例3:

 #include <stdio.h>
#include <stdlib.h>
#include <stdarg.h> int print(const char *format, ...)
{
va_list args;
const char *args1;
va_start(args, format);
args1 = va_arg(args, const char *);
args2 = va_arg(args, const char *);
va_end(args);
printf("format=%s args1=%s", format, args1, args2);
} int main()
{ print("", "");
}

运行结果:

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:

不同类型的函数参数:

 int print(const char *format, ...)
{
va_list args;
int args1;
va_start(args, format);
args1 = va_arg(args, int);
va_end(args);
printf("format=%s args1=%d", format, args1);
} int main()
{ print("", );
}

运行结果:

 /*
format=11111 args1=123
Process returned 22 (0x16) execution time : 0.007 s
Press any key to continue.
*/

但是注意不能使用:
总之,va_arg(ap,type)中的type绝对不能为以下类型:
——char、signed char、unsigned char
——short、unsigned short
——signed short、short int、signed short int、unsigned short int
——float

C语言函数不定参数实现方式的更多相关文章

  1. c语言重载(overriding in C)或函数不定参数个数

    google一下 c overiding发现有这样一段英文解释: Because C doesn't require that you pass all parameters to the funct ...

  2. C语言函数可变长度参数剖析

    C语言中的很多函数的入参被定义为可变参数,最典型的 int printf (const char * fmt, ...) 要对其中的可变参数进行处理,就要用到va_list类型和 VA_START, ...

  3. C语言函数可变参数列表

    C语言允许使用可变参数列表,我们常用的printf函数即为可变参数函数,C标准库提供了stdarg.h为我们提供了这方面支持:该头文件提供了一些类型和宏来支持可变参数列表,包括类型va_list,宏v ...

  4. js函数传递参数的方式------传值与传递指针

    原则: 1. 基本类型:传值 2. 对象:传递指针 应用场景之一: 用jq选择器获取某个div后(例如:element),准备进行某些修改,之后添加到页面中去. 采取例一的方式,append后发现修改 ...

  5. C语言不定参数

    最近,遇到一个c语言的不定参数问题.其实,对于c语言的不定参数问题,只需要三个函数就可以搞定了.这三个函数的头文件是<stdarg.h>,其实下面的三个函数都是一个宏定义(macro).  ...

  6. Go语言函数

    目录 函数定义 函数返回多个值 函数参数 Go 语言函数值传递 Go语言函数引用传递 函数用法 函数作为值 匿名函数 闭包 方法 不定参数的函数 init函数 内建函数 函数调用机制 总结 函数定义 ...

  7. GO 函数的参数

    一.函数 函数的参数 1.1 参数的使用 形式参数:定义函数时,用于接收外部传入的数据,叫做形式参数,简称形参. 实际参数:调用函数时,传给形参的实际的数据,叫做实际参数,简称实参. 函数调用: ​ ...

  8. Golang函数-不定参函数

    Golang函数-不定参函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  9. 有关 java 不定参数

    不定参数实际为数组参数的一种写法而已,本质上与数组参数完全相同 //1.数组参数函数 public static int sum(int[] values) { } //2.不定参数函数 不定参数只能 ...

随机推荐

  1. Angular.js之内置过滤器学习笔记

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  2. Struts2之环境配置

    在学习struts2之前,首先我们要明白使用struts2的目的是什么?它能给我们带来什么样的好处? 设计目标 Struts设计的第一目标就是使MVC模式应用于web程序设计.在这儿MVC模式的好处就 ...

  3. 用OC和Swift一起说说二叉树

    前言:    一:在计算机科学中,二叉树是每个节点最多有两个子树的树结构.通常子树被称作"左子树"(left subtree)和"右子树"(right subt ...

  4. select函数的用法

    首先介绍阻塞方式与非阻塞方式: 阻塞方式(block),就是进程或是线程执行到这些函数时必须等待某个事件的发生.如果事件没有发生,进程或线程就被阻塞,函数不能立即返回. 非阻塞方式(non-block ...

  5. Spring框架(6)---AspectJ实现AOP

    AspectJ实现AOP 上一篇文章Spring框架(4)---AOP讲解铺垫,讲了一些基础AOP理解性的东西,那么这篇文章真正开始讲解AOP 通过AspectJ实现AOP要比普通的实现Aop要方便的 ...

  6. Visual Studio 2017离线安装包,百度云分流

    Visual Studio正式版发布了,然而只能在线安装.虽然官方有提供了离线的方法,但还是蛮复杂的,所以我打包了两个版本发布至百度云分享. 离线分流 地址:http://pan.baidu.com/ ...

  7. PHP数据访问修改和多条件查询(20161030)

    查询分为关键字查询和准确查询 1.没有提交的时候--查所有 2.两个输入都为空--查所有3.第一个条件有,第二个为空--根据第一个条件查4.第一个没有,第二个有--根据第二个条件查5.两个都有--根据 ...

  8. El表达式的用法个人总结

    EL表达式的好处: 通过EL可以简化在JSP开发中对对象的引用,从而规范页面代码,增加程序的可读性及可维护性. EL表达式的几个特点:  1:可以与jsp标签库结合使用,也可以与javascript语 ...

  9. spdlog源码阅读 (3): log_msg和BasicWriter

    4. log_msg和它的打手BasicWriter 在spdlog源码阅读 (2): sinks的创建和使用中,提到log_msg提供了存储日志的功能.那么到底在spdlog中它是怎么 起到这个作用 ...

  10. 第一章 开发简单Java应用程序

    1. 什么是程序?     程序一词来自生活,通常指完成某些事务的一种既定方式和过程(一组有序指令的集合). 2. Java的三个领域? Java SE:java技术核心(指桌面应用程序)如:QQ.百 ...