C/C++函数的参数是存放在栈区的,并且参数的入栈是从参数的右边开始,即最后一个参数先入栈,而第一个参数最后才入栈,所以,根据栈的后进先出性质,函数总能找到第一个参数。
所以,可变参函数的实现必须能够从已知参数中获取到函数所需要参数的个数。
下面我用3个例子验证了可变参数的原理和应用。
函数压栈顺序可以从高地址到低地址,也可以从低地址到高地址,我所用测试环境是从低地址到高地址,所以第一个参数的地址值是最大的。
所以,可变参函数的实现必须能够从已知参数中获取到函数所需要参数的个数。
下面我用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;
}

最低0.47元/天 解锁文章
3423

被折叠的 条评论
为什么被折叠?



