在一个C语言程序中,我们定义一个函数,常规的参数个数都是有限的、确定的,如何让这个函数具有一个或多个以上的参数,这个时候就引入的可变参数的概念!这个就是基于栈帧理解的基础来进行使用!
注意点:
- 可变参数必须从左到右进行访问,可以不访问完,但是一开始就访问中间的参数是不被允许的;
- 参数列表至少有一个命名参数才可以使用va_start,可以有多个参数,但是应该以最左边为主;
- 这些宏无法判断参数的数量和类型;
- 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;
}
很想扒一波源代码,但是我还不会。。。。。