可变参数 省略号的使用

函数参数的传递原理

函数参数是以数据结构:栈的形式存取,从右至左入栈。

首先是参数的内存存放格式:参数存放在内存的堆栈段,在执行函数的时候,从最后一个开始入栈。因此栈底高地址,栈顶低地址。

理论上来说,只要获取到一个参数的地址,就可以通过地址偏移获取到其他参数的地址。

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 是一个字符指针,指向当前参数,取参需要用这个指针进行。

  1. 在调用参数表之前,定义一个va_list类型的变量ap;
  2. 对ap初始化,使用va_start初始化,第一个参数就是ap,第二个参数是省略号前的那个已知参数;
  3. 获取参数值,使用va_arg获取对应的参数值,第一个参数就是ap,第二个参数是你要获取值的类型,返回对应的值,获取之后该函数会把ap指向下一个参数的地址;
  4. 获取完毕之后,需要关闭指针,使用va_end关闭,参数就是ap,会把ap置空,一般va_end和va_start成对使用。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
int argMax(int count, ...) {
va_list ap;
va_start(ap, count);
int cur_max = 0;
for (int i = 0; i < count; ++i) {
int t = va_arg(ap, int);
printf("%d ", t);
if (0 == i) {
cur_max = t;
}
else {
cur_max = t > cur_max ? t : cur_max;
}
}
return cur_max;
}

int main() {
int a = 1, b = 2, c = 3, d = 4, e = -2;
printf("\n %d \n", argMax(5, a, b, c, d, e));
return 0;
}
/*
1 2 3 4 -2
4
*/

本文标题:可变参数 省略号的使用

文章作者:Tokey

发布时间:2020年05月11日 - 10:05

最后更新:2021年06月29日 - 22:06

原始链接:http://TokeyRoad.github.io/2020/05/11/可变参数-省略号的使用/

许可协议: 转载请保留原文链接及作者。

0%