#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;
}
C++不定參數綜合實例
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.