C语言关于指针函数可变参数的使用方法和打印相应数据

本文介绍了如何在C语言中使用`va_list`,`va_start`,`va_arg`,和`va_end`函数处理可变参数,通过`add`和`my_sum`函数展示了具体的应用实例,包括不同类型参数的读取和内存管理。
摘要由CSDN通过智能技术生成

 通过使用四个函数来实现 指针函数的可变参数操作;

四个函数分别为:

#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);

}

测试结果:

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值