文档章节

C语言中实现可变参数函数

乱蓬头
 乱蓬头
发布于 2017/05/22 14:53
字数 357
阅读 2
收藏 0

摘要:   通过stdarg.h头文件为函数提供了定义可变参数列表的能力。声明一个可变参数的函数类似: void f1(int n,...); 其中n表示参数列表个数,而用省略号来表示未知参数列表。stdarg.h中提供了一个va_list类型,用于存放参数。

  通过stdarg.h头文件为函数提供了定义可变参数列表的能力。声明一个可变参数的函数类似:
void f1(int n,...);

其中n表示参数列表个数,而用省略号来表示未知参数列表。stdarg.h中提供了一个va_list类型,用于存放参数。一个大概的使用过程类似:
void f1(int n,...)
{
   va_list ap;
   va_start(ap,n);   //初始化参数列表
   double first=va_arg(ap,double);  //取第一个参数
   int second=va_arg(ap,int);   //取第二个参数
   ...
   va_end(ap);  //清理工作
}
看一个求和的例子:

#include<stdio.h>
#include<stdarg.h>
double sum(int ,);
int main(void)
{
  double s,t;
  s=sum(3,1.1,2.2,13.3);
  t=sum(6,1.1,2.1,13.1,4.1,5.1,6.1);
  printf("return value for "  \
    "sum(3,1.1,2.2,13.3):   %g\n",s);
  printf("return value for " \
    "sum(6,1.1,2.1,13.1,4.1,5.1,6.1):    %g\n",t);
  return 0;
}
double sum(int lim,)
{
  va_list ap;
  double total=0;
  va_start(ap,lim);
  int i;
  for(i=0;i<lim;i++)
      total+=va_arg(ap,double);
  va_end(ap);
  return total;
}


C语言对可变参数的使用还是有点麻烦,不如ruby和java简便。比如ruby中定义并使用可变参数参数:
def sum(*e)
   e.inject{|sum,i| sum+=i}
end

sum(1,2,3,4,5)=>15

本文转载自:http://click.aliyun.com/m/21561/

共有 人打赏支持
乱蓬头
粉丝 0
博文 382
码字总数 2595
作品 0
私信 提问
可变参数函数

如果说C语言具有很多低级语言的特性,那么可变参数函数便是这些特性中的一个。无论是C专家还是C初学者,都对printf标准库函数相当了解,因为它是我们步入C语言的第一个函数。使用printf函数时...

长平狐
2012/09/03
113
0
iOS可变参数实现及原理剖析

你一定会时常见到有些方法的最后会有一个无关痛痒的 nil 参数,可曾想过为什么要带这个参数呢。 解答:因为这里参数的传递是可变参数的传递,拿[NSArray arrayWithObjects:]为例子,我们进入他...

JasonMs
2015/10/24
326
0
C语言函数一本道来

函数.png 函数的由来 程序=数据+算法 C程序=数据+函数 模块化程序设计 面向过程的程序设计 以过程为中心的编程思想 首先将复杂的问题,分解为一个个容易的问题 分解过后的问题可以按照步骤一...

PcDack
2017/12/07
0
0
C 不定长参数

C语言可变参简介 我们在C语言编程中会遇到一些参数个数可变的函数,例如printf()这个函数,它的定义是这样的:    int printf( const char* format, ...);   它除了有一个参数format固定以外...

MrLovelyCbb
2016/09/05
14
0
Linux编程每周一讲 -可变长度参数

可变长度参数在C语言里面不算什么新鲜的东西,但是它的应用范围很广,属于基础知识范围,因此将这个话题做为系列文章中的第一篇比较合适。 什么是可变长度参数呢?拿printf()来举例: printf...

阿男bluedash
2011/11/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Cloud Greenwich 新特性和F升级分享

2019.01.23 期待已久的Spring Cloud Greenwich 发布了release版本,作为我们团队也第一时间把RC版本替换为release,以下为总结,希望对你使用Spring Cloud Greenwich 有所帮助 Greenwich 只支...

冷冷gg
47分钟前
44
1
精读《论语》读后感作文3600字

精读《论语》读后感作文3600字: 学而篇第一:子曰:“学而时习之,不亦说乎?有朋友自远方来,不亦悦乎?人不知,而不愠,不亦君子乎? 朱熹解:即学而又时时习之,则学者熟,而衷心喜悦,其...

原创小博客
今天
0
0
CPU内存结构

开局一张图 由于CPU频率太快了,为解决直接读取内存的数据上的延迟,在CPU和内存之间,存在3级缓存。 CPU在解决和缓存不一致上采用两种方式: 缓存一致性协议 总线锁机制 CPU CPU的一个时钟周...

春哥大魔王的博客
今天
2
0
记一次centos 7内核升级事故

情景 公司做等保3测评,在进行系统漏洞检测时发现内核存在漏洞,需要进行升级。 名称 版本 升级前内核 CentOS Linux (3.10.0-327.el7.x86_64) 7 (Core) 升级后内核 CentOS Linux (3.10.0-957...

阿dai
今天
9
0
PowerDesigner操作

1.去掉生成DDL里的注释 Database -> Edit Current DBMS -> Script -> Syntax -> BlockComment,去掉BlockComment里面的value内容。...

了凡川
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部