博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言“…”占位符及可变参数函数
阅读量:6888 次
发布时间:2019-06-27

本文共 1303 字,大约阅读时间需要 4 分钟。

C语言函数的参数传递总是固定了个数,那么有没有传递任意个数参数的方法呢?在C++中,函数重载提供了多种参数传递的解决办法,但也不是任意参数个数。事实上,C语言是提供任意数量参数的解决方案的。

printf(),scanf()等就是这样一类可支持任意参数个数变量的函数,以下是printf的用法示例。

1 printf("%d",x);
2 printf(“%f”,y);
3 printf(“Hello my name is %s“, name);

这是printf的函数原型: int printf(const char *fmt, …)

注意它的第二个参数,“…”三个点。这是可变参数函数的参数,它的数量是可变动的,它使用省略号来忽略之后的参数。在这里其实是做了一个占位符的作用。

那么,传进来了多个参数,如何去使用它呢。这里需要用到一个头文件stdarg.h,以下是要用到的宏。va在这里是variable-argument(可变参数)的意思。

1 va_list 型的变量声明,比如 va_list arg_ptr;
2 void va_startva_list arg_ptr, prev_param ); 
3 //确定起始位置。通过形参中的已知参数。比如printf中的*fmt
4 type va_argva_list arg_ptr, type ); 
5 //得到下一个可变参数的值,type代表参数类型。每次调用va_arg都会改变arg_ptr值使得后续的参数值能被依次添加。
6 void va_endva_list arg_ptr ); 
7 //将指针置为无效

那么读取的做法显然是通过va_start定位起始位置,然后用va_arg一个个读取下来,最后用va_end将指针置为无效。

在函数的参数中,第一个参数的作用就是定位起始位置,如果是play(…)这样,我们就无法定位起始位置了,所以这个写法在C语言中是不能通过编译的,不过C++可以编译。

01 //一个实例代码:
02 #include <iostream>
03 #include "stdio.h"
04 #include "stdarg.h"
05 using namespace std;
06 void play(int n,...)
07 {
08     va_list ps;
09     int x=n;
10     va_start(ps,n); //以固定参数的地址为起点确定变参的内存起始地址。
11     for(int i=0;i<n;i++)
12     {
13         x=va_arg(ps,int); //得到下一个参数的值
14         printf("the %dth parameter is %dn",i,x); //输出占位符位置参数的值
15     }
16     va_end(ps); //将指针置为无效
17     return;
18 }
19 int main(int argc, char* argv[])
20 {
21     play(3,200,-1,8);
22     return 0;
23 }

转载请注明: » 

你可能感兴趣的文章
Android平板开发永久实现全屏的方法
查看>>
windows远程连接失败的原因
查看>>
我的友情链接
查看>>
JSCH会大量使用服务器内存吗?会
查看>>
2017年围绕自动驾驶会出现新一轮的淘金热,这是真的吗?
查看>>
Centos下邮件服务器(postfix)的配置(一)
查看>>
深夜,想到今天学的linux内容,太值了
查看>>
Thread类常用方法
查看>>
/etc/resolv.conf中内容被清空的解决办法
查看>>
Yarn大体框架和工作流程研究
查看>>
vue学习笔记(一)
查看>>
微软专家推荐11个Chrome 插件
查看>>
三天学会HTML5——SVG和Canvas的使用
查看>>
Azure 部署 Asp.NET Core Web App
查看>>
MySql基本操作(二)
查看>>
SaaS、PaaS和云计算 搅动未来软件发展
查看>>
App测试点
查看>>
运行jar包
查看>>
supervisor centos安装
查看>>
深入分析:Flash vs. HTML5 網路影音格式落誰家?
查看>>