可变参数列表

来源:互联网 发布:陕西网络品牌推广公司 编辑:程序博客网 时间:2024/06/06 21:03

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;}


0 0
原创粉丝点击