C "... "占位符和变量参数函数
最编程
2024-06-30 20:33:24
...
C语言函数的参数传递总是固定了个数,那么有没有传递任意个数参数的方法呢?在C++中,函数重载提供了多种参数传递的解决办法,但也不是任意参数个数。事实上,C语言是提供任意数量参数的解决方案的。
printf(),scanf()等就是这样一类可支持任意参数个数变量的函数,以下是printf的用法示例。
printf("%d",x);
printf(“%f”,y);
printf(“Hello my name is %s“, name);
这是printf的函数原型: int printf(const char *fmt, …)
注意它的第二个参数,“…”三个点。这是可变参数函数的参数,它的数量是可变动的,它使用省略号来忽略之后的参数。在这里其实是做了一个占位符的作用。
那么,传进来了多个参数,如何去使用它呢。这里需要用到一个头文件stdarg.h,以下是要用到的宏。va在这里是variable-argument(可变参数)的意思。
va_list 型的变量声明,比如 va_list arg_ptr;
void va_start( va_list arg_ptr, prev_param );
//确定起始位置。通过形参中的已知参数。比如printf中的*fmt
type va_arg( va_list arg_ptr, type );
//得到下一个可变参数的值,type代表参数类型。每次调用va_arg都会改变arg_ptr值使得后续的参数值能被依次添加。
void va_end( va_list arg_ptr );
//将指针置为无效
那么读取的做法显然是通过va_start定位起始位置,然后用va_arg一个个读取下来,最后用va_end将指针置为无效。
在函数的参数中,第一个参数的作用就是定位起始位置,如果是play(…)这样,我们就无法定位起始位置了,所以这个写法在C语言中是不能通过编译的,不过C++可以编译。
//一个实例代码:
#include <iostream>
#include "stdio.h"
#include "stdarg.h"
using namespace std;
void play(int n,...)
{
va_list ps;
int x=n;
va_start(ps,n); //以固定参数的地址为起点确定变参的内存起始地址。
for(int i=0;i<n;i++)
{
x=va_arg(ps,int); //得到下一个参数的值
printf("the %dth parameter is %d\n",i,x); //输出占位符位置参数的值
}
va_end(ps); //将指针置为无效
return;
}
int main(int argc, char* argv[])
{
play(3,200,-1,8);
return 0;
}
推荐阅读
-
全面了解 C 语言函数:从创建到使用,包括参数传递和返回值解析
-
全面了解 C 语言函数:从创建到使用,包括参数传递和返回值解析
-
玩转C语言基础:轻松掌握函数的定义、声明、调用和参数
-
C 语言笔记 —— 函数参数带 & 和不带 & 的区别
-
一步一步教你怎么在C语言中使用函数多参和默认参数
-
搞定命令行参数:C语言中的getopt和getopt_long函数详解
-
MySQL存储:理解变量、函数、游标、判断和循环中的IN、OUT和INOUT参数使用
-
全面解析MySQL存储过程:变量、游标、存储函数、循环和判断语句,以及参数传递的方法
-
3/5法则:理解C++中的拷贝构造函数和拷贝赋值操作符
-
如何在 VS Code 中设置调试参数:理解 launch.json 配置详情、利用 task.json 替换变量、开启自动保存与代码格式化、处理空格与制表符、探索函数调用链、掌握文件查找与全站搜索技巧