va_start(),va_arg(),va_end()的基本使用

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;
}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值