最近学生提出书上的一段代码比较难懂,开始没有在意,自己一看倒吓一跳,发现对于刚接触C语言的人来说,这一段代码是超级难,讲解的是关于多维数组的可变实现方式,如对于一个三维数组,
int A[2][3][4];
上面是我们通常定义方式,但是在老严的数据结构里面却用了比较复杂的指针形式,竟然还用到了变参。晕,这对于学生来说是太难了。因此,在这整理一下关于变参的用法!
1. C语言中函数变参的调用形式:
void foo(parm_list,...); /*后面的参数以...代替*/
2. 编译器在对参数进行处理时,是利用栈来实现的,即参数是由右向左入栈;
3. 如何读取变参,需要三个宏:
void va_start( va_list arg_ptr, prev_param );
type va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );
因此需要包含头文件<stdarg.h>
4.用法:如下图示例,首先定义一个va_list的变量arg_ptr,实际上是一个指针,指向可变参数的地址。
va_start将arg_ptr首先指向固定参数i后的第一个可变参数;va_arg则获取第一个可变参数的值,并将指针后移一个;读取完后要用va_end置为NULL。
注意:
1.可以多次读取参数,但是每次读取的过程同上,即首先va_start,va_arg, 最后va_end;
2.被调函数至少有一个固定参数,如int i;
调用结果如下:
1)simple_va_fun(100);
结果是:100 -123456789(会变的值)
2)simple_va_fun(100,200);
结果是:100 200
3)simple_va_fun(100,200,300);
结果是:100 200
int A[2][3][4];
上面是我们通常定义方式,但是在老严的数据结构里面却用了比较复杂的指针形式,竟然还用到了变参。晕,这对于学生来说是太难了。因此,在这整理一下关于变参的用法!
1. C语言中函数变参的调用形式:
void foo(parm_list,...); /*后面的参数以...代替*/
2. 编译器在对参数进行处理时,是利用栈来实现的,即参数是由右向左入栈;
3. 如何读取变参,需要三个宏:
void va_start( va_list arg_ptr, prev_param );
type va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );
因此需要包含头文件<stdarg.h>
4.用法:如下图示例,首先定义一个va_list的变量arg_ptr,实际上是一个指针,指向可变参数的地址。
va_start将arg_ptr首先指向固定参数i后的第一个可变参数;va_arg则获取第一个可变参数的值,并将指针后移一个;读取完后要用va_end置为NULL。
- void simple_va_fun(int i, ...)
- {
- va_list arg_ptr;
- int j=0;
- va_start(arg_ptr, i);
- j=va_arg(arg_ptr, int);
- va_end(arg_ptr);
- printf("%d %d/n", i, j);
- return;
- }
1.可以多次读取参数,但是每次读取的过程同上,即首先va_start,va_arg, 最后va_end;
2.被调函数至少有一个固定参数,如int i;
调用结果如下:
1)simple_va_fun(100);
结果是:100 -123456789(会变的值)
2)simple_va_fun(100,200);
结果是:100 200
3)simple_va_fun(100,200,300);
结果是:100 200