C语言可变参数
#include <stdio.h>
int sum(int num, int arg, ...);
void main()
{
int num=sum(5,1,2,3,4,5);
printf("%d\n",num);
}
int sum(int num, int arg, ...)
{
int n,summary;
va_list ap;
if(num < 1) return 0;
n = num;
va_start(ap, arg); /*init ap*/
summary = arg;
while(--n > 0)
{
summary += va_arg(ap, int); /*foreach*/
}
va_end(ap); /*dispose ap*/
return summary;
}
清爽版:
#include <stdarg.h>
#include <stdio.h>
int sum(int,...);
void main()
{
int num=sum(5,1,3,5,7,9);
printf("%d\n",num);
}
int sum(int count,...)
{
int sum=0;
va_list args;
va_start(args,count);
while(count--)
{
sum+=va_arg(args,int);
}
va_end(args);
return sum;
}
不使用库文件版:
#include <stdio.h>
int sum(int,...);
void main()
{
int num=sum(6,1,3,5,7,9,50);
printf("%d\n",num);
}
int sum(int count,...)
{
int sum=0;
//不使用C语言库
int *p=&count;
p++;
while(count--)
{
sum+=*p++;
}
return sum;
}
思考版:
#include <stdarg.h>
#include <stdio.h>
int sum(int num, int arg, ...);
void main()
{
int num=sum(5,1,3,5,7,9);
printf("%d\n",num);
}
int sum(int num, int arg, ...)
{
int n,summary,temp;
va_list ap;
if(num < 1) return 0;
n = num;
va_start(ap, arg); /*init ap*/
summary = arg;
while(--n > 0)
{
//#define va_arg(ap, type) (*((type *)(ap))++)
//First
//temp=va_arg(ap,int);
//Second
temp=(*((int *)(ap))++);//这句代码在VS2008的C++编译器下不通过,会报错“++需要左值”,但是在TurboC下编译通过
//Third
/*temp= *(int *)ap;
ap+=4; */
printf("%d,\n",temp);
summary +=temp; /*foreach*/
}
va_end(ap); /*dispose ap*/
return summary;
}
以下代码也是在C中编译通过,在C++中不能通过
void main()
{
int arr[3]={5,8,9};
void *p=arr;
(*((int *)(p))++);
printf("%d\n",*(int*)p);
/*
int num=sum(5,1,3,5,7,9);
printf("%d\n",num);
*/
}
解密函数参数:
#include <stdio.h>
void Fun(char c,int i, char* s,double d,int e)
{
char *p=&c;
int *p2;
char **p3;
double *p4;
int *p5;
clrscr();
printf("%c\n",*p);
// p++; 如果p++,则不管在TurboC还是Vs2008中都会报错,为什么?难道char类型的参数传参过程中不是只占一个字节?
p+=2;//在TurboC中为p+=2,在VS2008中位p+=4(TurboC中int占2个字节,VS2008中int占4个字节)
p2=(int *)p;
printf("%d\n",*p2);
p2++;
p3=(char **)p2;
printf("%s\n",*p3);
p3++;
p4=(double *)p3;
printf("%f\n",*p4);
p4++;
p5=(int *)p4;
printf("%d\n",*p5);
}
void main()
{
Fun('A',999,"hello",5.66,456);
}