C语言“…”占位符及可变参数函数

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}

转载请注明:旅途@KryptosX » C语言“…”占位符及可变参数函数

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值