C++不定参数综合实例

#include <conio.h>
#include <stdarg.h>
#include <iostream>
using namespace std;

/************************************************************************/
/*  
    type va_arg(va_list argptr, type);
  void va_end(va_list argptr);
  void va_start(va_list argptr, last_parm); 
	都包含在头文件<stdarg.h>中      
	任何可变长度的变元被访问之前,必须先用va_start()初始化变元指针argptr
	#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )
	#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) //第一个可选参数地址
	#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) //下一个参数地址
  #define va_end(ap) ( ap = (va_list)0 ) // 将指针置为无效
 */
/************************************************************************/

void test()
{
	double a;
	a = 1.1;
	int b = *(int*) & a;
	cout << (void*)&a << " " << (void*)&b << endl;
}

int sum(int i,...)
{ 
	int count;//参数个数
	int ra;
	int inst;  
	va_list markr;  
	va_start(markr, i);//获取地址
	ra = (*(int *)((int)markr - 8));//获得栈顶返回值
	inst = (*(int *)(*(int *)((int)markr - 8)));//获取指令
	count = ((inst&0xff0000)>>16)/4;//得到参数个数
	cout << "参数个数是:" << count << endl;
	va_end(markr);//释放
	va_list arg_ptr;
	va_start(arg_ptr, i);
	int* first;
	first = &i;
	int m;
	m =* first;//首先把第一个参数加上
	int j=0;
	while (1)
	{
		if(j >= (count-1))
			break;
		m+=va_arg(arg_ptr, int); 
		//这里  va_arg(arg_ptr, int)是从第二个参数开始递加返回
		j++;
	}
	va_end (arg_ptr);
	return m;
}

int sumi(int val, ...)
{
    va_list ap;
	va_end(ap);//置空
	cout << "ap=" << (void*)ap << endl;
	cout << "&val=" << (void*)&val << endl;
    va_start(ap,val);//va_start执行完毕后,ap指向变量val后第一个4字节对齐的地址
	cout << "va_start(ap,val)=" << (void*)va_start(ap,val) << endl;
    int sum = val;
	cout << "sum=" << sum << endl;
	cout << "ap=" << (void*)ap << endl;
    val = va_arg(ap, int);//使ap指向当前变量的下一个变量
	cout << "ap=" << (void*)ap << endl;
	
    while(0 != val)
    {
        sum = sum + val;
        val = va_arg(ap,int);
    }
    return sum;
}

int maxi(int val, ...)
{
	va_list vl;
	va_start(vl, val);//va_start执行完毕后,vl指向变量val后第一个4字节对齐的地址
	int max = val;
	int inst = (*(int *)(*(int *)((int)vl - 8)));//获取指令
	int count = ((inst&0xff0000)>>16)/4;//得到参数个数
	for (int i = 0; i < count-1; i++)
	{
		val = va_arg(vl, int);//使vl指向当前变量的下一个变量
		//cout << val << endl;
		if (val > max)
		{
			max = val;
		}
		//cout << "max: " << max << endl;
	}
	va_end(vl);//置空vl
	return max;
}

int fun2(const char *ch,int num,...)
{
    va_list ap;
    va_start(ap,num);
    va_list app = va_arg(ap, va_list);//获取下一层参数
    cout << ch << endl;
    for(int i=0;i<num;i++)
	{
		int t = va_arg(app,int);
		cout << t << " ";
    }
    cout << endl;
    
    va_end(ap);
    return 0;
}

int fun1(const char *ch,int num,...)
{
    va_list ap;
    va_start(ap,num);
	//不定参数之间之间传递参数
    fun2(ch,num,ap);
    va_end(ap);
    return 0;
}

int main(int argc, char* argv[])
{ 
	//这里的sum参数可以任意个
	cout << sum(35,40,20,10,100,1,2,3,4,10,20,30,40) << endl;
	cout << sumi(35,40,20,10,100,1,2,3,4,10,20,30,40,0) << endl;
	cout << "max(35,40,20,10,100,1,2,3,4,10,20,30,40) = " << maxi(35,40,20,10,100,1,2,3,4,10,20,30,40) << endl;
	fun1("Hello ",6,2,4,3,6,8,9);
	test();
	getch();
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值