`
kmplayer
  • 浏览: 498294 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C语言中的不定参数

阅读更多
1,最近刚刚知道C语言还有不定参数这么个东东。

2,解决方法:
三个宏的使用va_arg()、va_start()和va_end()
上述的宏原型如下所示:
  
type va_arg(va_list argptr, type);
void va_end(va_list argptr);
void va_start(va_list argptr, last_parm);

它们都包含在头文件<stdarg.h>中。

在VC++6.0中,这几个宏的定义:
  
#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1)) //类型n的大小
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) //ap指向第一个不定参数地址
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) //下一个参数地址  返回当前ap指向的值,并且增加ap
#define va_end(ap) ( ap = (va_list)0 ) // 将指针置为无效
 
总结:读取可变参数的过程其实就是堆栈中,使用指针,遍历堆栈段中的参数列表,从低地址到高地址一个一个地把参数内容读出来的过程.

3,不定参数函数有个限制,就是不定参数的列表必须在整个函数的参数列表的最后。
我们不可以定义如下的函数:
  void func(int a, ……, int c)
  所有类型固定的参数都必须出现在参数列表的开始。
  在设计具有不定参数列表的函数的时候,我们有两种方法来确定到底多少参数会被传递进来。
  方法1是在类型固定的参数中指明后面有多少个参数以及他们的类型。printf就是采用的这种方法,它的format参数指明后面每个参数的类型。
  方法2是指定一个结束参数。这种情况一般是不定参数拥有同样的类型,我们可以指定一个特定的值来表示参数列表结束。

4,实例代码:
#include <stdio.h>
#include <stdarg.h>
#include <string.h>

int sumi(int c, ...)
{
    va_list argptr;
    va_start(argptr, c); //初始化变元指针
    int sum = c;
    c = va_arg(argptr, int); //作为下一个参数类型的参数类型,返回不定参数
    //c保存第一个不定参数
    printf("%d\n", c);
    while(0 != c) //末尾特定字符指示结束
    {
        sum = sum + c;
        c = va_arg(argptr, int);
    }
    va_end(argptr);
    return sum;
}

double sum_series(int num, ...)
{
    double sum = 0.0, t;
    va_list argptr;
    va_start(argptr, num);//初始化变元指针
    while (num--)
    {
        t = va_arg(argptr, double);
        sum = sum + t;
    }
    va_end(argptr);
    return sum;
}

int main()
{
    int i = sumi(1,2,3,4,5,6,7,8,9,0);
    printf("%d\n", i);
    double d = sum_series(4, 1/3.0, 1/4.0, 1/5.0, 1/6.0);
    printf("%f\n", d);

    return 0;
}
分享到:
评论

相关推荐

    C语言中不固定多个参数的实现

    C语言中不定参数的实现

    不定参数在C语言中的应用实例

    不定参数在C语言中的应用实例:不定参数当年做为C/C++语言一个特长被很多人推崇,但是实际上这种技术并没有应用很多。除了格式化输出之外,我实在没看到多少应用。主要原因是这种技术比较麻烦,副作用也比较多,而...

    c语言可变参数实现示例

    这段代码展示了如何不使用中的va_list、va_start、va_end宏来实现自定义可变参数以及如何改变默认的%d、%f、%s等格式字符。 代码如下:#include &lt;stdio&gt;#include &lt;stdlib&gt; // itoa() and ltoa()#include &lt;string&gt; //...

    EDA/PLD中的不定参数在C语言中的应用实例

    不定参数在C语言中的应用实例:不定参数当年做为C/C++语言一个特长被很多人推崇,但是实际上这种技术并没有应用很多。除了格式化输出之外,我实在没看到多少应用。主要原因是这种技术比较麻烦,副作用也比较多,而...

    c语言函数参数用省略号的使用方法

    c语言讲解函数中省略号的使用 可不定参数 例如void fun(int a, ...) 后面可以加任意参数 使用方法

    C技巧:结构体参数转成不定参数

    这段程序是一个C语言的小技巧,其展示了如何把一个参数为结构体的函数转成一个可变参数的函数。

    C语言程序设计标准教程

    在形参表中给出的参数称为形式参数, 它们可以是各种类型的变量, 各参数之间用逗号间隔。在进行函数调用时,主调函数将赋予这些形式参数实际的值。 形参既然是变量,当然必须给以类型说明。例如,定义一个函数, ...

    C语言可变参数函数详解示例

    先看代码 代码如下:printf(“hello,world!”);其参数个数为1个。...后面的三个点…表示printf参数个数是不定的.如何实现可变参数函数?2. 编写可变函数准备为了编写可变参数函数,我们通常需要用到头文

    程序设计入门—C语言(完)-浙江大学-翁恺 视频.txt

    如果搞不定自己电脑上的编程软件,我们也会提供在网页中编写、运行C语言程序的方法。 课程大纲 01 程序设计与C语言 课时 1 计算机和编程语言 2 C语言 3 第一个程序 02 计算 课时 1 变量 2 数据类型 3 表达式 4 ...

    c语言经典案例

    本文件中讲述了c语言经典的282个案例,由浅入深。有利于提高广大爱好c语言编程的人员。 其中包括: 第1章 初识C语言 1 实例001 第一个C语言程序 2 实例002 一个完整的C语言程序 2 实例003 输出名言 3 实例004 用TC ...

    c语言编写单片机技巧

    此外,C语言程序具有完善的模块程序结构,从而为软件开发中采用模块化程序设计方法提供了有力的保障。因此,使用C语言进行程序设计已成为软件开发的一个主流。用C语言来编写目标系统软件,会大大缩短开发周期,且...

    <C语言>数据文件自动生成的实现 Lab2.zip

    功能描述:程序自动生成.txt文件,内部存放生成的数据,其中第一行存储数据的条数n,从第...条数参数n和文件名称参数FileName通过cmd中的命令行参数传入,两参数顺序不定,缺少参数时,条数n随机生成,文件名可以指定。

    有关va-list问题

    由于在C语言中没有函数重载,解决不定数目函数参数问题变得比较麻烦;即使采用C++,如果参数个数不能确定,也很难采用函数重载.对这种情况,有些人采用指针参数来解决问题.下面就c语言中处理不定参数数目的问题进行讨论

    C++中的变长参数深入理解

    变长参数的函数,即参数个数可变、参数类型不定的函数。设计一个参数个数可变、参数类型不定的函数是可能的,最常见的例子是printf函数、scanf函数和高级语言的Format函数。最近的一个项目中就遇到这么一个相关的...

    关于C/C++中可变参数的详细介绍(va_list,va_start,va_arg,va_end)

    由于在C语言中没有函数重载,解决不定数目函数参数问题变得比较麻烦,即使采用C++,如果参数个数不能确定,也很难采用函数重载。对这种情况,提出了指针参数来解决问题。 如printf()函数,其原型为:int printf( ...

    Printf函数的实现

    由于在C语言中没有函数重载,解决不定数目函数参数问题变得比较麻烦;即使采用C++,如果参数个数不能确定,也很难采用函数重载.对这种情况,有些人采用指针参数来解决问题。

    java语言风格

    在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。 Java不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编

    《汇编语言》-第三版-王爽-以及课后答案

    第1章 基础知识 1.1 机器语言 ...研究试验5函数如何接收不定数量的 参数 附注 附注1Intel系列微处理器的3种工作 模式 附注2补码 附注3汇编编译器(masm.exe)对jmp的 相关处理 附注4用栈传递参数 附注5公式证明

    基于TCP的服务器客户端程序设计.doc

    在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。 Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进 ...

    MD5加密算法(Java语言描述)

     MD5中有四个32位被称作链接变量(Chaining Variable)的整数参数,他们分别为:A=0x67452301,B=0xefcdab89,C=0x98badcfe,D=0x10325476。  当设置好这四个链接变量后,就开始进入算法的四轮循环运算。循环的...

Global site tag (gtag.js) - Google Analytics