您的位置:首页 > 其它

可变参数列表

2015-10-08 22:40 204 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: