函数的可变参数详谈,第1张

函数的可变参数详谈,第2张

可变参数的英文表达是:variable argument。

定义函数时,用三个点“.”来表示并用逗号与其他参数隔开。
可变参数的特点是:与固定参数不同,它们没有一一对应关系,也没有固定的参数类型和参数名称;可变参数的个数不
确定,但传入的参数可以是一个或多个;每个可变参数的类型可以不同,也可以相同;变量的每个参数都没有对应的
实际名称。
可以看出,可变参数的形式非常自由,富有弹性。所以给了有天赋的程序员更多的想象和发挥的空间空。
然而,更多的自由也增加了操作的难度。

1)可变参数的存储形式。

众所周知,一般函数的参数都属于局部变量,局部变量就是内存中存储的堆栈区(所谓堆栈区:由编译器自动分配释放,
存储函数的参数值,局部变量的值等。它像数据结构中的堆栈一样工作。).可变参数也存储在内存堆栈区域。
存储函数参数时,编译器从右到左逐个按栈。
这确保了栈顶是函数参数的第一个参数(从左到右)。在80x86平台上,内存分配顺序是从高地址内存到低地址内存。
函数的形参存储在内存中如下图(取乐(intvar1,intvar2,...、intvar3、intvar4)为例):
堆栈区域:

栈顶低位地址

|第一个固定参数var1
|第一个固定参数var2
|可变参数的第一个参数
|...
|可变参数的最后一个参数
|函数的倒数第二个固定参数var3
|函数

2)用于变量参数的头文件和相关宏的描述

这里用TC2.0编译器作为参考对象来说明。
变量参数的相关定义在名为“STDARG”的头文件中。这个文件是:
/* stdarg.h。

在接受
可变数量的参数的函数中访问参数的定义。

版权所有(c) Borland International 1987,1988
保留所有权利。
*/
# if _ _ STDC _ _
# define _ Cdecl
# else
# define _ Cdecl Cdecl
# endif

#如果!defined(_ _ STDARG)
# define _ _ STDARG

typedef void * va _ list

#define va_start(ap,parmN) (ap =...)
#define va_arg(ap,type)(*((type *)(AP))++)
# define va _ end(AP)
# define _ va _ ptr(...)
#endif

以上是“STDARG”的内容。h”。
该文件定义了变量参数使用的数据类型:typedef void * va _ list
va_start(ap,parmN)用于初始化,ap指向变量parameter的第一个参数。ap的类型是va _ list,
parmn是变量参数的前一个固定参数。
va_arg(ap,type)获取当前ap指向的参数,并使ap指向变量参数下方。

3)可变参数的例子

示例用途:用可变参数实现传递不定数量的字符串,并显示传递的字符串。

# include
# include
# include
void tvar arg(int num,...);/*num是变量参数的个数*/
int main(void)
{
clrscr();
tvar rg(5,“你好!”、“我的”、“名字”、“是”、“永不相同”。\ n ");
tvar rg(8,"这个","是","一个","例","关于","变元","在","函数");
getch();
返回0;
}
void tvar rg(int num,...)
{
va _ list argp;/*定义一个指向变量参数的变量*/
va_start(argp,num);/*初始化,使用argp指向第一个参数*/
while(-num > = 0)
printf(" % s ",(va _ arg (argp,char *));/*va_arg(argp,char*)获取argp指向的参数,
并使用argp指向下一个参数。char*使用获取的参数的类型转换为char* type。*/
va _ end(argp);/*结束变量参数获取*/
return;
}

4)可变参数使用中应注意的问题

1.每个函数最多有一个可变参数。
2。VA _ START (AP,Parmn)中的parmN是变量参数之前的固定参数。
3。可变参数的个数是不确定的,这是程序完全同意的。
4。可变参数的类型是不确定的,完全由VA _ ARG (AP那是因为函数
printf()从固定参数的格式字符串中分析出参数的类型,然后调用va_arg
得到可变参数。也就是说,要想智能识别变量参数,就得在自己的程序中做出判断

5。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 函数的可变参数详谈

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情