C语言的可变参数列表没有什么神秘,就是从已知的变量地址根据参数内存的分配是连续的来找出后边的所有参数
不信,你看底下代码
#include<iostream>
using namespace std;
//#include<stdarg.h>
typedef char* va_list;
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define va_end(ap) ( ap = (va_list)0 )
//#include<stdarg.h>
int Average(int argc, ...)//argc为要求平均数的个数
{
va_list pArg; // 声明一个指针, 用于持有可变参数
va_start(pArg, argc); // 将 pArg 初始化为指向第一个参数
int sum=0;
for(int i = 0; i != argc; ++i) // 输出参数
{
sum+= va_arg(pArg, int);// 获取 pArg 所指向的参数
}
va_end(pArg);//给 pArg 清零
return (sum/argc);
}
int My_Average(int argc, ...)
{
char*p = (char*)&argc +sizeof(argc);
int sum=0;
for(int i=0;i!=argc;++i)
{
sum+= *((int*)p+i);
}
p=NULL;//防止这个指针再次被使用造成在未知内存中进行操作
return (sum/argc);
}
int main()
{
cout<<Average(2,'3','5')<<endl;
cout<<My_Average(2,'3','5')<<endl;
return 0;
}