可变参数

C/C++函数的参数是存放在栈区的,并且参数的入栈是从参数的右边开始,即最后一个参数先入栈,而第一个参数最后才入栈,所以,根据栈的后进先出性质,函数总能找到第一个参数。
所以,可变参函数的实现必须能够从已知参数中获取到函数所需要参数的个数。 

下面我用3个例子验证了可变参数的原理和应用。
函数压栈顺序可以从高地址到低地址,也可以从低地址到高地址,我所用测试环境是从低地址到高地址,所以第一个参数的地址值是最大的。

不知道什么原因,在例1和例2中如果我用可变参数,传入参数的压栈并非按顺序递增或递减。所以我在这里用显示定义函数参数来进行测试。


example 1
基本的求所有参数值的和

#include <iostream>
#include <string>
using namespace std;

int Sum(int nCount,int,int,int) 
//int Sum(int nCount,...) //不知道什么原因,如果我用可变参数,传入参数的压栈并非按顺序递增或递减。
{     
	int nSum = 0;     
	int* p = &nCount;     
	for(int i=0; i<nCount; ++i) // 从已知参数(第一个参数)中获取到函数参数的个数。    
	{         
		cout << *(--p) << endl; //指针移动遍历每一个参数;由于我的环境压栈顺序是从低地址到高地址,所以从第一个参数地址(最高地址)依次递减。        
		nSum += *p;     
	}      
	cout << "Sum:" << nSum << endl;     
	return nSum; 
}  

int main()
{     
	Sum(3, 10, 20, 30);     
	return 1; 
} 


exa
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值