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语言中不定参数的实现
6. **C语言中不定参数的实现**:C语言的可变参数列表功能允许函数接收不同数量的参数,这在编写一些灵活的函数时非常有用。 7. **游戏编程**和**实用程序**:如病毒程序、仓储管理系统、电话存储系统等,这些项目...
在C语言中,可变参数列表提供了一种灵活调用函数的方式,允许函数接受不定数量的参数。这种特性在编写需要接受不同数量参数的通用函数时非常有用,例如打印函数。本文将深入解析C语言中可变参数列表的使用方法,包括...
1. 可变参数列表的实现原理:通过C语言预定义的宏va_start、va_arg、va_end在stdarg.h头文件中,可以使得函数访问参数个数不定的参数列表。 2. va_start宏的作用:va_start宏初始化参数列表,为后续使用va_arg宏...
C语言中的可变参数是一种特殊的函数参数形式,它允许函数接受不定数量和类型的参数。在日常开发中,我们常用的 printf 函数就是使用了可变参数的接口。今天,我们将深入探索 C 语言可变参数的实现机制。 首先,让...
不定参数在C语言中的应用实例:不定参数当年做为C/C++语言一个特长被很多人推崇,但是实际上这种技术并没有应用很多。除了格式化输出之外,我实在没看到多少应用。主要原因是这种技术比较麻烦,副作用也比较多,而...
`printf`之所以能够接受不定数量的参数并正确地处理它们,正是得益于C语言对可变参数的支持。本文将深入探讨C语言中的可变参数机制,重点解析`va_list`类型和`vsnprintf`函数的工作原理,以及如何实现类似于`printf`...
这段代码展示了如何不使用中的va_list、va_start、va_end宏来实现自定义可变参数以及如何改变默认的%d、%f、%s等格式字符。 代码如下:#include <stdio>#include <stdlib> // itoa() and ltoa()#include <string> //...
总结以上知识点,C语言中的可变参数函数提供了一种灵活的方式来编写那些需要接收不定数量参数的函数。通过`stdarg.h`提供的宏和数据类型,开发者可以访问这些参数并进行相应处理。然而,使用可变参数函数时需要谨慎...
c语言讲解函数中省略号的使用 可不定参数 例如void fun(int a, ...) 后面可以加任意参数 使用方法
在C语言中,可变参数函数是指那些在函数定义中允许接受不定数量参数的函数。这些函数的定义通常包括至少一个固定参数,后面跟着三个点(...),这表示函数能够接收额外的参数,但编译器在编译时并不知道具体的参数...
C语言的函数参数传递是程序设计中的一个重要概念,它直接关系到程序中数据的流动和处理方式。在C语言中,函数调用时的参数传递方式主要分为两种:值传递(Call by Value)和地址传递(Call by Address),也称作传值...
在编程中,不定参数函数是一种特殊的函数,其...这种方法在C语言标准库中广泛应用,例如在printf或scanf函数中就可以看到不定参数的应用。通过正确地使用这些宏,我们可以在自己的函数中灵活地处理不确定数量的参数。
选项D(在调用函数中必须说明数组的大小)是错误的,因为C语言允许不定长度的数组参数,但调用时通常需要知道数组的大小以便正确操作。 10. **函数作用域内的变量覆盖**:在`main`函数中调用`fun2`时,局部变量`m`...
不定参数在C语言中的应用实例:不定参数当年做为C/C++语言一个特长被很多人推崇,但是实际上这种技术并没有应用很多。除了格式化输出之外,我实在没看到多少应用。主要原因是这种技术比较麻烦,副作用也比较多,而...
在C语言中,函数参数通常是固定的,每个函数都要求特定数量和类型的参数。然而,有时候开发者可能需要创建能够接受可变数量参数的函数,比如`printf`或`scanf`等。这种情况下,C语言提供了变长参数列表的功能,通常...
在C语言中,变参数技术允许函数接受数量不定的参数。这种技术在处理像`printf`这样的函数时非常有用,`printf`可以根据提供的格式字符串和任意数量的变量来生成输出。`printf`的原型如下: ```c int printf(const ...
C语言支持在定义函数时允许函数带有可变数量的参数,这对于需要处理不定数量参数的函数来说非常有用。在C语言中,处理可变参数函数的基本机制涉及以下步骤和知识点: 1. **问题的提出**:在实际应用中,我们经常会...