您的位置:首页 > 编程语言 > C语言/C++

c语言中关于函数参数中(包含...),占位符。

2017-03-03 13:30 232 查看
在内网代码中出现saveasser(const char *x_format,...)不解

这个知识点有关与函数重载。C++中有函数重载这种方法,以供我们调用时可以不确定实参的个数,其实 C 语言也可以,而且更高明!

我们在stdio.h 中可以看到 printf() 函数的原型:

int printf(char * format,...)

事实上,我们如果要写这样的函数也可以类似的写,那么在定义函数时用上这个符号“ ... ” ,它叫占位符,喊它“ 三个点 ” 也可以,只要你愿意!那么我可以这样定义我的函数:

fun(int a,...){   }     

 va_list
va_arg()
va_start()

这三个很重要。

在调用函数时,程序同样会把实参传入,在函数存储区保存起来,如果有很多参数,将一起保存起来。

这时候就要用到va_list 了,这是个类型定义,我们可以把它理解成一个指针,它指向第一个参数的地址

如果,我们这样定义: va_list pp ;

则pp 就是这样一种变量,它是指向所有参数中的第一个参数的。它不同于一般的指针变量,它是个复合变量,

如果这样写:va_start(pp,a);

那么pp 就指向第一个参数 a 了,并且可得到 a 的类型 int 。
这时候如果有下一个参数,就需要使pp 指向下一个参数,并且得到它的类型。同样需要使用函数来实现,

这个函数是: va_arg()

下面我们看一个简单的例子:

#include <stdio.h>

#include<stdarg.h>

void fun(int a,...)

{

va_list pp;

int n=1;//使用 n 计量参数个数

va_start(pp,a);

do

{

printf("第 %d 个参数 =%d/n",n++,a);

a=va_arg(pp,int);//使 pp 指向下一个参数,将下一个参数的值赋给变量 a

}

while (a!=0);//直到参数为 0 时停止循环

}

main()

{

fun(20,40,60,80,0);

}

注意!

一定要有上面两个文件包含命令,因为程序中用到的那3个小东东都在那个文件里。其实真正意义上应该说那是函数,实质上那不过是两个宏,呵呵。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐