//使用可变参数,实现函数,求函数参数的平均值。
#define_CRT_SECURE_NO_WARNINGS1
#include<stdio.h>
#include<windows.h>
#include<stdarg.h>
int average1(intnum,...)
{
char*p = #
int i = 1;
intsum = 0;
while(i <=num)
{
sum =sum + *(int*)(p +4 * i);
//将字符指针强转为整型指针,得到整型数据,可变参数的类型是什么,就强转为什么类型
i++;
}
return sum /num;
}
int average2(int num,...)
{
va_list arg;//va_list相当于上述的char*,va_listarg相当于char*arg
int i = 0;
int sum = 0;
va_start(arg,num);//va_start相当于arg=&num
while(i <num)
{
sum =sum +va_arg(arg,int);
/*va_arg两个参数,一个是va_list定义的变量,即指向参数列表中的第一个字符指针变量
第二个参数是参数列表中第二个参数的类型
该函数的作用是由指向参数列表中的第一个指针变量arg得到第二个变量的值,然后指针变量
后移,指向第二个变量
*/
i++;
}
return sum /num;
va_end(arg);
}
int main()
{
int a = 10;
int b = 9;
int c = 8;
int avg1_1 = average1(2, a, b);
int avg1_2 = average1(3, a, b, c);
int avg2_1 = average2(2, a, b);
int avg2_2 = average2(2, a, b);
printf("自定义形式:avg1_1 = %d\n", avg1_1);
printf("自定义形式:avg1_2 = %d\n", avg1_2);
printf("库函数形式:avg2_1 = %d\n", avg2_1);
printf("库函数形式:avg2_2 = %d\n", avg2_2);
system("pause");
return 0;
}
源代码:
#ifdef _M_ALPHA
typedef struct{
char *a0;
int offset;
}va_list;
#else
typedef char * va_list;
#endif
#define _VA_LIST_DEFINED
#endif
#ifdef _M_IX86
#define _INTSIZEOF(n) ( (sizeof(n) +sizeof(int) - 1) & ~(sizeof(int) - 1) )
//sizeof(n)=4(00000011),sizeof(int)=4(00000100),
//(sizeof(n)+sizeof(int)-1)=(00000110)
//~ (sizeof(int)-1)=(11111100)
//(00000101&11111100)=(000000100)
//INTSIZEOF(n):将4个字节看作一个单位,看n占几个单位。
#define va_start(arg,n) ( arg =(va_list)&n + _INTSIZEOF(n) )
//类似于arg=(char *)&n+4,先将n取地址后强制转化为字符型指针,再加4,指向n之后的参数
#define va_arg(arg,int) ( *(int*)((arg += _INTSIZEOF(int)) - _INTSIZEOF(int)) )
//将arg所指向的内容以整型来提取,再使arg指向下一个参数
#define va_end(arg) ( arg =(va_list)0 )
//使指针arg的内容值为空