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个小东东都在那个文件里。其实真正意义上应该说那是函数,实质上那不过是两个宏,呵呵。
这个知识点有关与函数重载。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个小东东都在那个文件里。其实真正意义上应该说那是函数,实质上那不过是两个宏,呵呵。
相关文章推荐
- 关于C语言中函数调用和参数传递机制的探讨(二 .传递一个参数)
- 转载-关于C语言中函数调用和参数传递机制的探讨
- 关于C语言头文件包含的常用函数介绍
- 关于C语言中函数调用和参数传递机制的探讨
- 【C语言】为下面的函数原型编写函数定义: int ascii_to_integer(char *str); 这个字符串参数必须包含一个或者多个数字,函数应该把这些数字字符转换为整数并返回这个整数。
- 关于对于C语言中主函数参数接返回值的理解
- 关于C语言中函数调用和参数传递机制的探讨 (转)
- 关于C语言中函数调用和参数传递机制的探讨
- 关于C语言中函数调用和参数传递机…
- 关于C语言可变参数函数的一些研究和总结
- C语言关于可变参数函数的例子
- 关于C语言中printf函数的参数执行顺序
- 关于C语言中函数调用和参数传递机制的探讨(zz)
- 关于C语言中函数调用和参数传递机…
- C语言:数据类型、存储区字节数、占位符、sizeof、输入输出、二进制相关、操作符(++,--)、主函数参数
- 关于C语言中函数调用和参数传递机制的探讨--汇编
- 黑马程序员---------C语言 关于数组被当作函数参数传递的问题
- C语言学习4: 函数返回值与传入参数,关于函数值传递和类型隐性转换,变量不同的作用域,static变量,多文件编译例如两个C文件,显示函数调用语句跳转,递归,斐波那契数列,多文件编译相同变量的问题。
- 关于C语言中函数调用和参数传递机制的探讨
- 关于C语言中函数调用和参数传递机制的探讨