下面是自我检测的区域,查看题目,自我回答,感觉自己掌握了就可以打勾

  • 什么方法可以使非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