1.可变参数
- 形如 int func(int a, ...) {} //第一个参数代表确定的参数,第二个代表任意数量个参数。
- 第一个确定的参数,可以用来作相应的开发。比如printf的原型就是int printf(const char *fmt, ...);我们可以定多个输入参数,就是通过可变参数来实现并且解析的。
2.函数的参数:
函数参数是以数据结构:栈的形式存取,从右至左入栈。
首先是参数的内存存放格式:参数存放在内存的堆栈段中,在执行函数的时候,从最后一个开始入栈。因此栈底高地址,栈顶低地址,举个例子如下:
void func(int x, float y, char z);那么,调用函数的时候,实参 char z 先进栈,然后是 float y,最后是 int x,因此在内存中变量的存放次序是 x->y->z,因此,从理论上说,我们只要探测到任意一个变量的地址,并且知道其他变量的类型,通过指针移位运算,则总可以顺藤摸瓜找到其他的输入变量。
- 可以用下面这个实验来作基本的验证:va_start(),va_arg(),va_end()的基本使用。。
#include <iostream>
#include <string>
#include <fstream>
#include <cstdarg>
using namespace std;
void fun(const char *format, ...)
{
va_list args;
va_start(args, format); //通过确定的参数format确定形参在栈中的参考位置
// 根据传入的参数来依次的解析数据:
// 由于形参是从右到左入栈。从上到下依次入栈。
// 传入的5个参数"AAA", 1, "BBB", 2 ,"xxxx"
// 而栈从上到下依次增长。
cout << va_arg(args, char *) << endl; // AAA
cout << va_arg(args, int) << endl; // 1
cout << va_arg(args, char *) << endl; // BBB
cout << va_arg(args, int) << endl; // 2
va_end(args);
}
int main()
{
fun("xxxx", "AAA", 1, "BBB", 2);
return 0;
}