关于C语言可变参数函数的写法及其应用
以前一直以为C语言的函数都是精确匹配的,直到看了 C和C指针 才知道还有可变参数的函数。仔细一想,平时最常用的printf ,scanf 不就是可变参数的吗。
先上代码,随后详细讲解可变参数函数的用法。
#include<stdio.h> #include<stdarg.h> void fun(int num, ...) { int i; int res = 0; va_list v1; //v1实际是一个字符指针,从头文件里可以找到 va_start(v1, num); //使v1指向可变列表中第一个值,即num后的第一个参数 printf("*v = %d\n",*v1); for(i = 0; i < num-1; i++) //num 减一是为了防止下标超限 { res = va_arg(v1, int); //该函数返回v1指向的值,并是v1向下移动一个int的距离,使其指向下一个int printf("res = %d, *v1 = %d\n",res, *v1); } va_end(v1); //关闭v1指针,使其指向null } int main(void) { fun(4,1,2,3,4); return 0; }
这个函数简单的介绍了可变参数函数的用法。
首先,必须包含stdarg.h 头文件,我们用到的东西,都在这个头文件中。包括 va_list,va_start,va_arg, va_end。
va_list 用于定义一个指向参数的指针,其实就是一个char* 的指针。
va_start(v1, num); 将v1指针指向可变参数的第一个参数。通过打印*v1可知,打印出来的是,1 ,正是第一个可变参数。
res = va_arg(v1, int); 这个函数返回v1指针所指的值,并使v1指针
移动sizeof(int) = 4, 个字节,使其指向下一个参数。以前一直以为当参数类型为char 时,应该写char, 但是今天实践了一下发现,当为char时系统会自动提升为int,当为float时自动提升为double, 字符串时为char * 。。。。…
va_end(v1); 最后一句,为了安全性,关闭v1指针,其实就是使v1为null。
本文关于可变参数函数的介绍就到这里。想要深入理解的可以去看看头文件里面的定义。