下面是自我检测的区域,查看题目,自我回答,感觉自己掌握了就可以打勾
- 什么方法可以使非main函数传递多个参数,并且该函数应该怎么表示,需要用到哪个头文件,这个头文件里面只有3个函数是哪3个函数,分别有什么作用
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
/* va=var=变量 注意: { 1:va_list是一个堆栈结构体,准备接收"..."接收到的参数! 2:va_start(va_list类型变量,参数个数) ;初始化va_list结构体堆栈的深度! 3:va_arg(va_list类型变量,数据类型) ; 出栈符合该数据类型的下一个参数! 4:va_end(va_list类型变量) ;释放va_list类型的堆栈空间! } */
void Sum(int, ...); //"..."准备接收不定个数的变量! == 入栈操作!+
void SRDARG_TEXT()
{
Sum(5, 1, 2, 3, 4, 5); //堆栈深度5,参数;
}
void Sum(int Numbers, ...)
{
int SUM = 0;
va_list Buff_List; //建立va_list结构体变量
va_start(Buff_List, Numbers); //初始化堆栈深度
for (size_t i = 0; i < Numbers; i++)
{
//注意va_arg()是出栈!
SUM = SUM + va_arg(Buff_List,int); //堆栈依次出栈,注意i只能控制出栈次数,不能控制哪一个位置出栈!
}
va_end(Buff_List); //释放结构体空间!
printf("%d", SUM);
}
=================================================
运行结果:
topeet@ubuntu:~/Desktop$ ./a.out
15
记住va_arg这个函数,这个stdarg.h是解决函数传递不确定个参数而生的,我们知道可以为main函数传递不确定个数的参数,存放在argv[]里面,个数就是argc,但是普通的函数于main函数不一样,如果需要传递不确定个参数进去,需要这个头文件,里面就只有三个函数,一个是初始化堆栈的深度(用来存储传递进来的不确定个数的参数),函数是va_start;另一个是出栈va_arg;最后一个是释放堆栈va_end