通过使用四个函数来实现 指针函数的可变参数操作;
四个函数分别为:
#include <stdarg.h>
va_list ap; //初始化 参数列表指针
va_start(ap, count); //将ap指针指向第一个参数COUNT 这个是必须存在的 否则无法定位到后面的参数
va_arg(ap, int); //这个是按顺序读取写入的参数 每运行一次只能读取一个 不用的数据,需要用不同的
//类型去接受 我试验过的有 char* int double 这些都可以读取出来
va_end(ap); //释放ap指针的内容 防止函数运行结束后内存泄漏;
下面是我的测试程序:
#include <stdarg.h>
#include <stdio.h>
void my_sum(int count, ...);
void (*funtion)(int count, ...);
void add(int count, ...) {
va_list ap;
int a;
int b;
int sum = 0;
int i = 0;
//sum += va_arg(ap, int);
va_start(ap, count);//用于标记这个COUNT的地址 为寻找后面的参数提供解决办法
printf("%d \n", va_arg(ap, int));
printf("%d \n", va_arg(ap, int));
printf("%f \n", va_arg(ap, double)); // float 不可行 原因 : 未知
printf("%s \n", va_arg(ap, char *));
printf("%c \n", (char)va_arg(ap, int));
// 这个 我也有一点不理解 为什么va_arg(ap, char) 不能够输出
// 我的理解是 va_arg(ap, int) 是一个整型 然后将其变为Char型就可以输出一个R
// 我计划尝试一下float
printf("%f \n", (float)va_arg(ap, double)); //这个可以正常输出 但是我还是不清楚为什么 只能是 DOUBLE !-0-!
va_end(ap);
}
int main() {
funtion = add;
(*funtion)(3, 15, 15, 2.555555, "asdfghjkl", 'R', 2.5);
return 0;
}
void my_sum(int count, ...) {
//将要用来存放需要的某个可变参数的指针的信息
va_list ap;
char *prompt;
int sum = 0;
//开始的初始化,其中ap含有指向可变参数的指针的信息,count是当前函数中最后一个非可变的参数(这样才能定位).
va_start(ap, count);
//获取并返回下一个可变参数的值,第一个参数是ap不用说了,第二个参数是要获取的参数的类型。
//根据文档,如果类型指定错误了,或者没有下一个可变参数了,那么返回的结果是随机的。
prompt = va_arg(ap, char *);
printf("%s\n", prompt);
int i;
for (i = 0; i < count; ++i) {
sum += va_arg(ap, int);
}
//使用完可变参数之后要用这个来释放资源
va_end(ap);
printf("%d\n", sum);
}
测试结果: