可变参数
使用场景:不确定传入参数的个数,例如printf,scanf,
原理:由于函数参数是存放在栈中的,而且是从左到右依次入栈(参数的地址从左到右依次增大),从右到左依次初始化,所以,函数的参数位置是确定的,一旦我们知道了某一个参数的地址我们就可以获得所有参数的地址。
知道了原理就可以自己来实现一个可变参数了。
首先取得first的地址。
void test(int first, ...) {
printf("第一个参数的地址:%p\n", &first);
printf("第二个参数的地址:%p\n", &first + 1);
printf("第二个参数的值:%d\n", *(&first + 1));
}
int main() {
test(5, 10);
return 0;
}
通过结果可以发现,发现first参数是在栈底,向上寻找4个字节就是第二个参数的地址。同样这就是为什么形参初始化的时候是从左到右,也就是从上到下依次初始化的。

本文介绍了可变参数的使用场景及其实现原理,并通过示例代码展示了如何利用这些原理来获取参数列表中的所有值,进而实现一个简易版的printf函数。
最低0.47元/天 解锁文章
2135

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



