可变参数

来源:互联网 发布:linux u盘 删除分区表 编辑:程序博客网 时间:2024/06/13 05:51
<pre name="code" class="cpp">#define _INTSIZEOF(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )//((sizeof(3) + sizeof(int) - 1) & ~(sizeof(int) - 1) )//((3 + 4 - 1) &~(4 - 1) )  将n的值提升为int(可为其他类型)的整数倍// 例如 3->4  2->4  6->8 9->12#define va_start(ap,v)          ( ap = (va_list)&v + _INTSIZEOF(v) )//arg = (char *)&n + _INTSIZEOF(n)//       将&n强制转化为字符指针#define va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )//(*(int *)((arg += _INTSIZEOF(n)) - _INTSIZEOF(n)) )//先将arg的地址加4并赋值给arg,然后将arg-4地址中内容强制转化并取出来#define va_end(ap)      ( ap = (va_list)0 )// arg = char *0//arg = NULL  避免野指针//可变参数int Avg(int n, ...){va_list arg;  //char *arg;va_start(arg,n);//得到一个字符指针argint sum = 0;for(int i=0; i<n; ++i){sum += va_arg(arg,int);//得到一个字符指针arg}va_end(arg);  //arg = 0; //野指针return sum / n;}void main(){int avg = Avg(3,10,20,30);printf("avg = %d\n",avg);int *p = NULL;}



0 0
原创粉丝点击