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實際上指向了一個待打印輸出的字符串。
現在先瞭解到這裏,以後真正用到的時候再詳細討論。