C语言中如何实现可变参函数C语言中可变参函数实现,主要通过VA_LIST宏及相关操作的几个宏 。
一、涉及宏及说明:
所有相关宏均定义在stdarg.h中 。
1、va_list: 可变参数列表指针 。
2、va_start:获取可变参数列表的第一个参数的地址 。
3、va_arg:获取可变参数的当前参数 , 返回指定类型并将指针指向下一参数 。
4、va_end:清空va_list可变参数列表 。
可变参函数的实现,就是这四个宏的使用 。
二、代码举例:
在实际应用中,经常有获取若干个数最大值的情况,当数量比较大的时候,一般通过数组实现,但个数不多时 , 一般写一个max函数 。常规写法都是用到几个数的max,就写几个参数,对此可以实现一个可变参数函数,第一个参数指定共计有多少数据 , 后续各个参数为要比较的值 。
#include stdio.h
#include stdarg.h
int max(int n, ...)//可变参数函数 。
{
int r,i;
va_list ap;//定义可变参数 。
if(n == 0) return -1;//异常参数 。
va_start(ap, n);//得到起始点 。
for(i = 0; in; i ++)
{
int v=va_arg(ap,int) ;//获取下一个参数值 。
if(i == 0) r=v;
else if(rv) r=v;
}
va_end(ap);//结束可变参数 。
return r;//返回结果 。
}
可以用如下主函数测试:
int main()
{
printf("%d\n",max(1, 1));
printf("%d\n",max(2, 2,1));
printf("%d\n",max(3, 5,9, 4));
printf("%d\n",max(4, 8 , 3,1,9));
return 0;
}
分别测试了1,2,3,4个数值,求取最大值的情况 。
测试结果:
1
2
9
9
C语言中主函数怎么向声明的函数传递多个参数?#includestdio.h
void cal(float a, float b); /*根据你的意思看,改成这样*/
int main(void)
{
float number1,number2;
scanf("%f %f",number1,number2);
while((scanf("%f %f",number1,number2))==2)
{
cal(number1,number2);//报错说这一行声明参数过多 , 不知道该如何解决?
printf("over!");
scanf("%f %f",number1,number2);
printf("Please enter another two floats\n");
}
printf("IUPUT ERROR!\n");
return 0;
}
void cal(float a, float b)/*根据你的意思看,改成这样*/
{double results;
results=(a-b)/(a*b);
printf("%f",results);
}
c语言 在主函数中怎么接受有多个参数的函数的返回值1、看你这个func的功能像是要交换a,b的值,单实际是无法完成,调用func(a,b)时,实参a,
b的值传入func(int
a,
int
b)中形参int
a,
int
b中,也就是说形参是实参的一个副本,func执行时,交换的是形参的值,而实参a,b的值根本不会改变 。这种参数传递方式叫值传递 。还有一种方式叫引用传递 , 可以实现你这个交换功能 。
2、关于返回值,你想返回多个值?这是不可能的,如果真想返回多个值,只能通过输出参数来实现 。
c语言中的printf()这样的有不定个参数的函数是如何实现的首先先看到main函数中的不定参数:
1.引用:在Turbo C2.0启动过程中, 传递main()函数三个参数: argc, argv和env 。
* argc:整数, 鴐ain()的命令行参数个数 。
* argv:字符串数组 。
argv[0] 为程序运行的全路径名
argv[1] 为在DOS命令行中执行程序名后的第一个字符串;
argv[2] 为执行程序名后的第二个字符串;
...
argv[argc]为NULL 。
*env:字符串数组 。env[] 的每一个元素都包含ENVVAR=value形式的字符
串 。其中ENVVAR为环境变量 。value 为ENVVAR的对应值
#include stdlib.h
#include stdio.h
推荐阅读
- 中班体育游戏组织与实施,中班体育游戏设计思路
- 大桥视频配什么文字,拍大桥的说说
- 播放怪兽格斗游戏,怪兽格斗的游戏
- 人物营销如何做的更好,人物营销的实例并评价其营销效果
- java类似qq的源代码 java模仿
- sap怎么管理可回收包材,sap库存物资报废出库
- 个人名义开发小程序,个人开发小程序上线需要什么
- 步步高照片怎么保存到u盘,步步高相册里的图片怎么编辑
- 关于vb.net显示说明的信息