c语言中如何实现可变参数

c语言函数库中有不少类似于printf,scanf的函数,这些函数接收的参数个数是不确定的。这些函数实际是通过<stdarg.h>文件中的va_list,va_start,va_arg,va_end宏定义是实现的。另外,我们知道程序运行时的内存结构后,也可以通过直接访问这些内存空间获得实际参数值(事实上stdarg.h文件中的相关宏定义就是这么操作的)。

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>


int sum1(int nums);
int sum2(int nums);

int main()
{
	int result1 = 0;
	int result2 = 0;
	result1 = sum1(5, 1, 2, 3, 4, 5);
	result2 = sum2(5, 1, 2, 3, 4, 5);
	printf("result1 is %d\n",result1);
	printf("result2 is %d\n",result2);
	system("pause");
}

//栈是从高地址到低地址生长的,c语言中函数参数是从右向左依次入栈的
//c语言中入栈出栈是由函数调用者决定的(_ccall)
//c++中入栈出栈是由函数本身负责的(_stdcall),c++中也支持可变参数,
//但需要需要声明为int sum1(int nums,...)形式
int sum1(int nums)
{
	int result = 0;
	int *argptr = &nums;//获得参数nums的地址	
	for (int i = 0; i < nums; i++)
		result += *(++argptr);

	return result;
}

//利用<stdarg.h>中的va_list,va_start,va_end,va_arg宏定义实现
int sum2(int nums)
{
	int result = 0;
	va_list argptr;
	va_start(argptr,nums);
	for (int i = 0; i < nums; i++)
		result += va_arg(argptr, int);
	va_end(argptr);

	return result;
}

程序运行结果如下



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值