C语言中的不定参数


说到C语言中的不定参数,就需要提到C语言中函数调用时的参数入栈顺序了


显然,我们如果可以取得参数1的地址,那么顺藤摸瓜,就可以找到其他参数了,那么怎么确定传递了多少个参数呢,我们暂时规定最后一个参数为0.

用常规的方法,

#include <stdio.h>

int myfunc(int first, ...)
{	
	int sum = 0;
	int * varg_ptr = NULL;
	
	sum = first;
	varg_ptr = (&first) + 1;
	
	while(0 != (*varg_ptr))
	{
		sum += (*varg_ptr);
		varg_ptr++;				
	}		
	
	return sum;	
}


int main()
{
	int sum = 0;	
	sum = myfunc(1, 2, 3, 4, 5, 0);						
	printf("SUM = %d\n", sum);	
}
便可以实现对不定参数的求和。

在C语言中,规定了一组宏,是使我们程序员不再需要注意那么多细节。

#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1)) //类型n的大小
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) //ap指向第一个不定参数地址
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) //下一个参数地址  返回当前ap指向的值,并且增加ap
#define va_end(ap) ( ap = (va_list)0 ) // 将指针置为无效


_INTSIZEOF(n)宏用来4字节对齐,也就是说,如果某个参数的大小是5,6,7,8字节的话,经过_INTSIZEOF宏处理,都能变成8字节,这可以提高程序运行的效率。

其他的就比较好看懂了。

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

int myfunc(int first, ...)
{	
	int sum = 0;
	int num = 0;
	va_list varg_ptr;
	
	num = first;
	va_start(varg_ptr, first);
	
	do
	{
		sum += num;
		num = va_arg(varg_ptr, int);
	}while(num != 0);
	
	va_end(varg_ptr);
	return sum;	
}


int main()
{
	int sum = 0;	
	sum = myfunc(1, 2, 3, 4, 5, 0);						
	printf("SUM = %d\n", sum);	
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值