可变参数的源码剖析和理解

在一个C语言程序中,我们定义一个函数,常规的参数个数都是有限的、确定的,如何让这个函数具有一个或多个以上的参数,这个时候就引入的可变参数的概念!这个就是基于栈帧理解的基础来进行使用!

注意点:

  1. 可变参数必须从左到右进行访问,可以不访问完,但是一开始就访问中间的参数是不被允许的;
  2. 参数列表至少有一个命名参数才可以使用va_start,可以有多个参数,但是应该以最左边为主;
  3. 这些宏无法判断参数的数量和类型;
  4. va_start必须确保指定正确的类型,在后续的函数调用中是根据类型提取数据,一旦出错,结果非常糟糕;

老规矩,上代码:

1、使用可变参数,实现函数,求函数参数的最大值。


#include <stdio.h>
#include <stdarg.h>
#include <windows.h>
int Max(int n, ...)//后续参数的个数是可变的
{
	va_list arg;//将它理解为char *指向不确定部分
	int i = 0;
	int m = 0;
	va_start(arg,n);//宏函数,进行初始arg过程, 使得arg指向可变参数的第一个参数;
	for (; i < n; i++)
	{
		int x = va_arg(arg, int);
		if (m < x)//使arg指向可变列表的下一个参数,为下次循环做准备,整体指向原本参数
			m = x;
	}
	return m;
	va_end(m);//结束,将arg指针指向null
}

int main()
{
	int m = Max(2, 8, 6);
	printf("max:%d\n", m);
	system("pause");
	return 0;
}
2、再上一个题:模拟实现printf函数,可完成下面的功能
//能完成下面函数的调用,print("s ccc d.\n","hello",'b','i','t',100);
//函数原型:print(char *format, ...)

//分析题目意思:题目的意思是实现print函数,当第一个参数读到s时打印hello,

//当第一个参数读到c时,打印一个字符;第一个参数读到d时,打印一个整型数字100; 当读到空格的时候,打印空格

#include <stdio.h>
#include<stdlib.h>
#include <stdarg.h>//C标准函数库的头文件,stdarg是由standard arguments简化而来,主要为让函数能够接收可变参数
#include <windows.h>

void print(char *sen, ...)//后续参数的个数是可变的
{
	va_list arg;
	va_start(arg, sen);
	while (*sen != '\0')
	{
		if (*sen == 's')
		{
			puts(va_arg(arg, char*));//字符输出
		}
		else if (*sen == 'c')
		{
			putchar(va_arg(arg, char));//字符串输出
		}
		else if (*sen == 'd')
		{
			int d = va_arg(arg, int);
			printf("%d\n", d);
		}
		sen++;
	}
	va_end(arg);//结束,将arg指针指向null
}


int main()
{
	print("s ccc d.\n", "hello", 'b', 'i', 't', 100);
	system("pause");
	return 0;
}
很想扒一波源代码,但是我还不会。。。。。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值