c语言可变参数函数原理 关于函数的可变参数
c语言可变参数是干什么的
可变参数是用于调用函数时,不知道参数的个数及类型的一种场合,最经典最常用的是
十载的延平网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。全网营销推广的优势是能够根据用户设备显示端的尺寸不同,自动调整延平建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联从事“延平网站设计”,“延平网站推广”以来,每个客户项目都认真落实执行。
int
printf(const
char
*format[,
argument,
...]);
它后面的参数类型及数量都是可变的
如
printf("%d",x);
//一个int参数
printf("%d%d%s\n",x,y,z);
//三个参数,前两个为int,后面的为char
*
C语言变参函数Printf实现机制是什么?
在C/C++中,对函数参数的扫描是从后向前的。C/C++的函数参数是通过压入堆栈的方式来给函数传参数的(堆栈是一种先进后出的数据结构),最先压入的参数最后出来,在计算机的内存中,数据有2块,一块是堆,一块是栈(函数参数及局部变量在这里),而栈是从内存的高地址向低地址生长的,控制生长的就是堆栈指针了,最先压入的参数是在最上面,就是说在所有参数的最后面,最后压入的参数在最下面,结构上看起来是第一个,所以最后压入的参数总是能够被函数找到,因为它就在堆栈指针的上方。printf的第一个被找到的参数就是那个字符指针,就是被双引号括起来的那一部分,函数通过判断字符串里控制参数的个数来判断参数个数及数据类型,通过这些就可算出数据需要的堆栈指针的偏移量了,下面给出printf("%d,%d",a,b);(其中a、b都是int型的)的汇编代码.
.section
.data
string out = "%d,%d"
push b //最后的先压入栈中
push a //最先的后压入栈中
push $out//参数控制的那个字符串常量是最后被压入的
call printf
你会看到,参数是最后的先压入栈中,最先的后压入栈中,参数控制的那个字符串常量是最后被压入的,所以这个常量总是能被找到的。
通常情况下函数可变参数表的长度是已知的,通过num参数传入,这种函数比较容易实现。
在C语言中,printf是一个典型的参数个数可变的函数。用文字和图说明此类参变函数的实现原理。
c中 printf 前面的字符串是用来告诉编译器 都有哪些格式的数据在后面等着输入(包括格式、个数)
后面的即为可变参数的实现;有点多 你百度下下面这个关键字,会有你想要的
stdarg.h中三个宏va_start ,va_arg和va_end的应用
发个链接吧()
C语言中如何实现可变参函数
C语言中可变参函数实现,主要通过VA_LIST宏及相关操作的几个宏。
一、涉及宏及说明:
所有相关宏均定义在stdarg.h中。
1、va_list: 可变参数列表指针。
2、va_start:获取可变参数列表的第一个参数的地址。
3、va_arg:获取可变参数的当前参数,返回指定类型并将指针指向下一参数。
4、va_end:清空va_list可变参数列表。
可变参函数的实现,就是这四个宏的使用。
二、代码举例:
在实际应用中,经常有获取若干个数最大值的情况,当数量比较大的时候,一般通过数组实现,但个数不多时,一般写一个max函数。 常规写法都是用到几个数的max,就写几个参数, 对此可以实现一个可变参数函数,第一个参数指定共计有多少数据,后续各个参数为要比较的值。
#include stdio.h
#include stdarg.h
int max(int n, ...)//可变参数函数。
{
int r,i;
va_list ap;//定义可变参数。
if(n == 0) return -1;//异常参数。
va_start(ap, n);//得到起始点。
for(i = 0; i n; i ++)
{
int v=va_arg(ap,int) ;//获取下一个参数值。
if(i == 0) r=v;
else if(rv) r=v;
}
va_end(ap);//结束可变参数。
return r;//返回结果。
}
可以用如下主函数测试:
int main()
{
printf("%d\n",max(1, 1));
printf("%d\n",max(2, 2,1));
printf("%d\n",max(3, 5,9, 4));
printf("%d\n",max(4, 8 , 3,1,9));
return 0;
}
分别测试了1,2,3,4个数值,求取最大值的情况。
测试结果:
1
2
9
9
c语言中什么是可变参数?最好有简单的应用可变参数的例子。谢谢
一个简单的可变参数的函数的例子:
#include stdio.h
#include stdarg.h
void Func(int count, ...) //可变形参的函数的定义
{
va_list ap;
int n = count; //使用count来表示后面的参数个数
char *s = NULL;
int d = 0;
double f = 0.0;
va_start(ap, count); // 从第二个形参开始读取
s = va_arg(ap, char*); //为形参指定类型char*
d = va_arg(ap, int); //为形参指定类型int
f = va_arg(ap, double); //为形参指定类型double
va_end(ap); //读取形参结束
printf( "%s %d %f ", s, d, f); //这里可以做想要的功能了。
}
main()
{
Func(3, "Hello", 345, 788.234);
}
当前标题:c语言可变参数函数原理 关于函数的可变参数
当前网址:http://ybzwz.com/article/docsddj.html