1.可变参数产生原因
首先来看一个简单的例子。
int Add(int x, int y)
{return x + y;
}
int main()
{int sum = 0;sum = Add(1, 2);//sum = Add(1, 2, 3);//sum = Add(1);system("pause");return 0;
}
我们可以看到,对于这个代码只可以计算两个数的加法。
这样我们引入一个新的知识点!
可变参数实现求任意数的和
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>int Add(int num, ...)
{int sum = 0;va_list arg;va_start(arg, num);for (int i = 0; i < num; i++){sum += va_arg(arg, int);}va_end(arg);return sum;
}
int main()
{printf("%d\n", Add(4, 2, 3, 4, 5));system("pause");return 0;
}
详解
1.main()函数第一句
printf("%d\n", Add(4, 2, 3, 4, 5));
第一个4表示元素个数剩余表示元素内容
2.
操作符的含义:
1.
va_list arg;
宏操作符 | 实际含义 | 详解 |
---|---|---|
va_list | char * | va_list arg 创建一个字符指针arg,用于访问参数列表的未确定部分。 |
2.
va_start(arg, num);
(ap=(va_list)&v + _INTSIZEOF(v))
宏操作符 | 实际含义 | 详解 |
---|---|---|
va_start (ap,v) | (ap=(va_list)&v + _INTSIZEOF(v)) | 初始化变量arg ,va_start有两个参数,它的第一个参数是va_list所创建的字符指针。第2个参数是“…”之前的那个参数;(不可以读省略号) |
va_start (arg,num) | (arg=(char *)&v + _INTSIZEOF(num)) | |
_INTSIZEOF | (sizeof(n) + sizeof(int)-1 & ~(sizeof(int)-1) | 跳过num,来到位置参数的第一个参数。向上取四的整数倍 |
3.
for (int i = 0; i < num; i++){sum += va_arg(arg, int);}
宏操作符 | 实际含义 | 详解 |
---|---|---|
va_arg(ap,t) | (*(t*)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t))) | (*(t*)((arg += _INTSIZEOF(int)) - _INTSIZEOF(int))) |
(*(t*)((arg += _INTSIZEOF(int)) - _INTSIZEOF(int))) | (*(int *)((arg += 4) - 4)) | |
(arg += 4) - 4) | arg; arg+=4; | 先给arg加4再减,arg这次产生的结果没变,但是arg指向了下一个位置。一个代码做了两个动作 |
for (int i = 0; i < num; i++){sum += va_arg(arg, int);}
取出所有未知参数,然后加给sum
宏操作符 | 实际含义 | 详解 |
---|---|---|
va_end(ap) | (ap = (va_list)0) | 给指针赋值空指针。不用的时候释放 |
va_end(arg);
防止指针乱指用完一定要释放。