printf()的原型是int printf(const char *fmt, ...);后面三个 . 表示C语言的变参。
那么什么是变参?它有什么功能和作用呢?
变参就是参数不确定,可以随意根据需要来改变的参数。
我们先举一个固定参数列表的函数:
int swap(int a,int b)
{
int c;
c=a;
a=b;
b=c;
return a;
}
这是随便写的一个函数,虽然由于里面全都是局部变量的原因所以并不能交换参数,但是这个函数的形式还是挺不错的。
再举例一个可变参数列表函数:
void names(int a , ...)
{
……
}
反正只是定义一个而已,里面的内容就省略了。大家可以看到,下一个参数可以是任意的参数,但是局部变量可知,所有参数的值在调用时要被复制给栈中的连续内存,所以必须有一个普通变量来寻址后续的可变参数的类型和地址。
也就是说,在使用C语言的变参时,需要将变参,也就是...放在最后一个参数的位置,并且变参前面至少要有一个普通的参数。
这里有一个例子:
#include <stdarg.h>
#include <stdio.h>
void func1(const char * str1, ...)
{
char *pp;
pp = ((char*)&str1) + sizeof(str1);
printf("%d\n", *(int*)pp);
pp = pp + sizeof(int);
printf("%d\n", *(int*)pp);
pp = pp + sizeof(int);
printf("%s\n", *((char**)pp));
}
int main()
{
func1("%d %d %s\n", 4, 5, "hello world");
return 0;
}
这个函数其实是不对的,原因就是里面存在内存对齐这个问题,但是作为认识和了解可变参数已经足够了。
这里的const char * str1实际上指向了一个待打印输出的字符串。
现在先了解到这里,以后真正用到的时候再详细讨论。