#include<stdio.h>
#include<stdarg.h>
//函数调用堆栈
//函数编译链接的过程
int average(int count,int a,int b)//int _ average(int,int,int)
{
return (a + b)/count;
}
int average(int count,int a,int b,int c)//int _ average(int,int,int,int)
{
return (a + b + c)/count;
}
/*
#define _crt_va_start(ap,v) ( ap = (va_list) (&(v)) + sizeof(v) )
#define _crt_va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define _crt_va_end(ap) ( ap = (va_list)0 )
#define _crt_va_start(arg,count) ( arg = (char*) (&(count)) +sizeof(count) )
#define _crt_va_arg(arg,int) ( *(int *)((arg += sizeof(int)) - sizeof(int)) )
#define _crt_va_end(arg) ( arg = (char *)0 )
*/
int Max(int count,...)//10,20,30
{
va_list arg;//char *arg 可变参数是三个宏定义的
va_start(arg,count);// 开始访问参数
int max = va_arg(arg,int);//访问参数 10
int tmp =0;
//找最大值
for(int i = 1;i < count;i++)
{
tmp = va_arg(arg,int);
if(max < tmp)
{
max = tmp;
}
}
va_end(arg);//arg = NULL
return tmp;
}
/*
#define _crt_va_start(arg,count) ( arg = (char*) (&(count)) +sizeof(count) )
#define _crt_va_arg(arg,int) ( *(int *)((arg += sizeof(int)) - sizeof(int)) )
#define _crt_va_end(arg) ( arg = (char *)0 )
*/
void Print(int count,...)
{
char *p = (char*) (&(count)) + sizeof(count);
int tmp = 0;
for(int i = 0;i < count;i++)
{
tmp = ( *(int *)((p += sizeof(int)) - sizeof(int)) );
printf("%d\n",tmp);
}
p = NULL;
}
int main()
{
//printf("%d\n",Max(2,10,20));
//printf("%d\n",Max(4,10,30,32,40));
Print(5,10,30,32,41,20);
return 0;
}
//
void Print(const char *str,...)
{
char* list;
list = (char*)(&str) + sizeof(str);//_crt_va_start(list,str);
int num;
int ch;
char *p;
double d;
while(*str != '\0')
{
if(*str == '%')
{
switch(*(str+1))
{
case 'd':
num = ( *(int *)((list += sizeof(int)) - sizeof(int)) );
printf("%d",num);
str += 2;
break;
case 'c':
ch = ( *(char *)((list += sizeof(char)) - sizeof(char)) );
putchar(ch);
str += 2;
(char *)list += 3;
break;
case 's':
p = ( *(char **)((list += sizeof(char*)) - sizeof(char*)) );
printf("%s",p);
str += 2;
break;
case 'f':
d =( *(double *)((list += sizeof(double)) - sizeof(double)));
printf("%f",d);
str += 2;
break;
default:
putchar(*str++);
break;
}
}
else
{
putchar(*str++);
}
}
list = NULL;
}
int main()
{
Print("%%,%s,%d,%c,%f\n","hello",10,'a',12.5);
return 0;
}