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:
#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语言函数不定参数实现方式的更多相关文章
- c语言重载(overriding in C)或函数不定参数个数
google一下 c overiding发现有这样一段英文解释: Because C doesn't require that you pass all parameters to the funct ...
- C语言函数可变长度参数剖析
C语言中的很多函数的入参被定义为可变参数,最典型的 int printf (const char * fmt, ...) 要对其中的可变参数进行处理,就要用到va_list类型和 VA_START, ...
- C语言函数可变参数列表
C语言允许使用可变参数列表,我们常用的printf函数即为可变参数函数,C标准库提供了stdarg.h为我们提供了这方面支持:该头文件提供了一些类型和宏来支持可变参数列表,包括类型va_list,宏v ...
- js函数传递参数的方式------传值与传递指针
原则: 1. 基本类型:传值 2. 对象:传递指针 应用场景之一: 用jq选择器获取某个div后(例如:element),准备进行某些修改,之后添加到页面中去. 采取例一的方式,append后发现修改 ...
- C语言不定参数
最近,遇到一个c语言的不定参数问题.其实,对于c语言的不定参数问题,只需要三个函数就可以搞定了.这三个函数的头文件是<stdarg.h>,其实下面的三个函数都是一个宏定义(macro). ...
- Go语言函数
目录 函数定义 函数返回多个值 函数参数 Go 语言函数值传递 Go语言函数引用传递 函数用法 函数作为值 匿名函数 闭包 方法 不定参数的函数 init函数 内建函数 函数调用机制 总结 函数定义 ...
- GO 函数的参数
一.函数 函数的参数 1.1 参数的使用 形式参数:定义函数时,用于接收外部传入的数据,叫做形式参数,简称形参. 实际参数:调用函数时,传给形参的实际的数据,叫做实际参数,简称实参. 函数调用: ...
- Golang函数-不定参函数
Golang函数-不定参函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- 有关 java 不定参数
不定参数实际为数组参数的一种写法而已,本质上与数组参数完全相同 //1.数组参数函数 public static int sum(int[] values) { } //2.不定参数函数 不定参数只能 ...
随机推荐
- Linux tomcat设置ip地址直接访问,tomcat设置ip地址直接访问,tomcat绑定ip地址
Linux tomcat设置ip地址直接访问,tomcat设置ip地址直接访问,tomcat绑定ip地址 >>>>>>>>>>>> ...
- Keepalived + HAProxy 搭建【第一篇】HAProxy 的安装与配置
第一步:准备 1. 操作系统 CentOS-7-x86_64-Everything-1511 2. 安装包 haproxy-1.7.2.tar.gz 第二步:安装 # tar zxvf haproxy ...
- Flume-ng源码解析之Channel组件
如果还没看过Flume-ng源码解析之启动流程,可以点击Flume-ng源码解析之启动流程 查看 1 接口介绍 组件的分析顺序是按照上一篇中启动顺序来分析的,首先是Channel,然后是Sink,最后 ...
- Java中的for each实现原理与坑
文章转载自「开发者圆桌」一个关于开发者入门.进阶.踩坑的微信公众号 在Java中,遍历集合和数组一般有以下三种形式: for (int i = 0; i < list.size(); i++) ...
- java 限定控制台输入值的类型
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader; public cl ...
- mtime,ctime,atime
mtime,ctime,atime是linux三个主要的变动时间. 这三个时间比较容易理解,但是不容易记忆,也容易搞混. mtime (modification time) 文件内容数据更改时,会更 ...
- Swift3.0 函数闭包与OC Block
刚接触Swift,如有不对的点,欢迎指正.转载请说明出处 定义一个基本函数 //定义一个函数,接收一个字符串,返回一个String类型的值 func test(name:String) -> S ...
- 《Django By Example》第十章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:翻译本章过程中几次想放弃,但是既然 ...
- mac开发环境配置
折腾了好几天了,终于安装一部分了,mac装的win10,太占空间了,看到学习资源使用的工具,自己搜了一下安装了,在学习使用git的时候,都说mac比win好用多了,我tm为啥抱着mac装win费劲呢! ...
- Jenkis Editable Email Notification Plugin 使用介绍
Jenkis Editable Email Notification Plugin 使用介绍 前言 Jenkins本身提供的Email插件功能实在有限,只能提供当前Job的基本信息,比如成功.失败以及 ...