c语言函数库中有不少类似于printf,scanf的函数,这些函数接收的参数个数是不确定的。这些函数实际是通过<stdarg.h>文件中的va_list,va_start,va_arg,va_end宏定义是实现的。另外,我们知道程序运行时的内存结构后,也可以通过直接访问这些内存空间获得实际参数值(事实上stdarg.h文件中的相关宏定义就是这么操作的)。
#include <stdio.h> #include <stdlib.h> #include <stdarg.h> int sum1(int nums); int sum2(int nums); int main() { int result1 = 0; int result2 = 0; result1 = sum1(5, 1, 2, 3, 4, 5); result2 = sum2(5, 1, 2, 3, 4, 5); printf("result1 is %d\n",result1); printf("result2 is %d\n",result2); system("pause"); } //栈是从高地址到低地址生长的,c语言中函数参数是从右向左依次入栈的 //c语言中入栈出栈是由函数调用者决定的(_ccall) //c++中入栈出栈是由函数本身负责的(_stdcall),c++中也支持可变参数, //但需要需要声明为int sum1(int nums,...)形式 int sum1(int nums) { int result = 0; int *argptr = &nums;//获得参数nums的地址 for (int i = 0; i < nums; i++) result += *(++argptr); return result; } //利用<stdarg.h>中的va_list,va_start,va_end,va_arg宏定义实现 int sum2(int nums) { int result = 0; va_list argptr; va_start(argptr,nums); for (int i = 0; i < nums; i++) result += va_arg(argptr, int); va_end(argptr); return result; }
原文地址:http://blog.csdn.net/kyt511/article/details/46490555