C语言之 认识可变参数

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实际上指向了一个待打印输出的字符串。

现在先了解到这里,以后真正用到的时候再详细讨论。

时间: 2024-10-10 02:12:06

C语言之 认识可变参数的相关文章

C语言之函数可变参数

先上一段代码: #include<cstdarg> #include<iostream> #include<string> using namespace std; void error(char* format,...){//至少要有一个参数,后边的...表示参数可变 va_list ap; int d,flag; char c, *s; va_start(ap,*format);//从args参数开始后面都是可变参数,va_start,va_end都为宏 while

c语言中对可变参数列表的简单理解

函数原型中一般情况下参数的数目是固定的,但是如果想在不同的时候接收不定数目的参数时该怎么办呢?c语言提供了可变参数列表来实现. 可变参数列表是通过宏来实现的,这些宏定义在stdarg.h的头文件中.头文件中声明了一个va_list类型和va_start.va_arg.va_end三个宏.我们使用可变参数列表的时候需要声明一个va_list类型的变量配合这三个宏使用. va_start(va_list变量名,省略号前面最后一个有名字的参数):在提取可变参数前必须调用这个宏实现初始化. va_arg

C语言中的可变参数函数 三个点“…”printf( const char* format, ...)

第一篇 C语言编程中有时会遇到一些参数个数可变的函数,例如printf()函数,其函数原型为: int printf( const char* format, ...); 它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的(用三个点“…”做参数占位符),实际调用时可以有以下的形式: printf("%d",i); printf("%s",s); printf("the number is %d ,string is:%s",

【转载】c语言中的可变参数编程

在c语言中使用变长参数最常见的就是下面两个函数了: int printf(const char *format, ...); int scanf(const char *format, ...); 那他们是怎样实现支持变成参数的呢?在使用变长参数的函数(这里假设是func)实现部分其实用到了stdarg.h里面的多个宏来访问那些不确定的参数,它们分别是: void va_start(va_list ap, last); type va_arg(va_list ap, type); void va

C语言学习020:可变参数函数

顾名思义,可变参数函数就是参数数量可变的函数,即函数的参数数量是不确定的,比如方法getnumbertotal()我们即可以传递一个参数,也可以传递5个.6个参数 1 #include <stdio.h> 2 #include <stdarg.h>//实现可变参数需要的头文件 3 4 int getnumbertotal(int args,...){//可变参数要放在普通参数(args)的后面:...表示有很多个参数 5 va_list l;//用来保存传给函数的其他参数 6 va

【c语言】用可变参数列表实现一个简化的printf函数

//实现一个简化的printf函数. #include <stdarg.h> #include <string.h> void my_printf(const char *str,...) { va_list arg; //准备访问可变参数 va_start(arg,str); while(*str != '\0') { switch(*str) { case 'c': putchar( va_arg( arg,char ) ); break; case 's': puts( va

【C语言】用可变参数列表实现printf函数

//用可变参数列表实现printf函数 #include <stdio.h> #include <stdarg.h> void my_printf(const char *str,...) { va_list fun; va_start (fun,str); while(*str!=0) { if(*str=='c') { putchar(va_arg(fun,char )); } if(*str=='s') { puts(va_arg(fun,char *)); } str++;

C语言函数的可变参数列表

可变参数列表可通过宏来实现,这些宏定义在stdarg.h头文件中,它是标准库的一部分.这个头文件声明了一个类型va_list和三个宏----va_start,va_arg,va_end.可以声明一个类型为va_list的变量,与这几个宏配合使用,访问参数的值.参数列表的可变部分位于一个或多个普通参数(命名参数)的后面(即参数列表中至少要有一个命名参数),它在函数原型中以一个省略号表示. 例如:定义一个函数average可以计算若干个整数的平均值: 1 #include <stdarg.h> 2

C语言函数可变参数列表

C语言允许使用可变参数列表,我们常用的printf函数即为可变参数函数,C标准库提供了stdarg.h为我们提供了这方面支持:该头文件提供了一些类型和宏来支持可变参数列表,包括类型va_list,宏va_start.va_arg.va_end: 可变函数参数定义方法: #include <stdarg.h> void func(int count,...){ va_list ap; int ix, tmp; va_start(ap, a); for(ix=0;ix < count; ++