函数参数的传递原理
函数参数是以数据结构:栈的形式存取,从右至左入栈。
首先是参数的内存存放格式:参数存放在内存的堆栈段,在执行函数的时候,从最后一个开始入栈。因此栈底高地址,栈顶低地址。
理论上来说,只要获取到一个参数的地址,就可以通过地址偏移获取到其他参数的地址。
stdarg.h
下面是<stdarg.h>里重要的几个宏定义:
typedef char* va_list;
void va_start(va_list ap, prev_param);
void va_arg(va_list ap, type);
void va_end(va_list ap);
va_list 是一个字符指针,指向当前参数,取参需要用这个指针进行。
- 在调用参数表之前,定义一个va_list类型的变量ap;
- 对ap初始化,使用va_start初始化,第一个参数就是ap,第二个参数是省略号前的那个已知参数;
- 获取参数值,使用va_arg获取对应的参数值,第一个参数就是ap,第二个参数是你要获取值的类型,返回对应的值,获取之后该函数会把ap指向下一个参数的地址;
- 获取完毕之后,需要关闭指针,使用va_end关闭,参数就是ap,会把ap置空,一般va_end和va_start成对使用。
示例:
1 | int argMax(int count, ...) { |