重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
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
#include
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实际上指向了一个待打印输出的字符串。
现在先了解到这里,以后真正用到的时候再详细讨论。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。