<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);//得到一个字符指针arg
int 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;
}
可变参数
最新推荐文章于 2023-04-02 00:30:33 发布