24小时热门版块排行榜    

Znn3bq.jpeg
北京石油化工学院2026年研究生招生接收调剂公告
查看: 590  |  回复: 3
【奖励】 本帖被评价2次,作者yalefield增加金币 1.5

[资源] 【分享】C语言,怎么玩可变参数 已有1人参与

printf()函数原型为:
  int printf( const char* format, ...);
这里面就有可变参数,三个点 ...

  printf("%d",i);
  printf("%s",s);
  printf("the number is %d ,string is:%s", i, s);

这三个点,能应付那么多情况.......羡慕嫉妒恨!

怎样写一个简单的可变参数的C函数

例子:该函数至少有一个整数参数,其后是占位符…,表示后面参数的个数不定.
在这个例子里,所有的输入参数必须都是整数,函数的功能是打印所有参数的值.

  函数代码如下:

  //示例代码1:可变参数函数的使用

  #include "stdio.h"
  #include "stdarg.h"
  void simple_va_fun(int start, ...)
  {
    va_list arg_ptr;
    int nArgValue =start;
    int nArgCout=0; //可变参数的数目

    va_start(arg_ptr,start);
    //以固定参数的地址为起点确定变参的内存起始地址。

    do
    {
      ++nArgCout;
      printf("the %d th arg: %d\n",nArgCout,nArgValue);
      //输出各参数的值
      nArgValue = va_arg(arg_ptr,int);
      //得到下一个可变参数的值
    } while(nArgValue != -1);

    return;
  }

  int main(int argc, char* argv[])
  {
    simple_va_fun(100,-1);
    simple_va_fun(100,200,-1);
    return 0;
  }

  使用可变参数应该有以下步骤:

  ⑴在程序中将用到以下这些宏:

  void va_start( va_list arg_ptr, prev_param );
  type va_arg( va_list arg_ptr, type );
  void va_end( va_list arg_ptr );

  va在这里是variable-argument(可变参数)的意思.

  这些宏定义在stdarg.h中,所以用到可变参数的程序应该包含这个头文件.

  ⑵函数里首先定义一个va_list型的变量,这里是arg_ptr,这个变量是指向参数地址的指针.因为得到参数的地址之后,再结合参数的类型,才能得到参数的值。
  ⑶然后用va_start宏初始化⑵中定义的变量arg_ptr,这个宏的第二个参数是可变参数列表的前一个参数,也就是最后一个固定参数。
  ⑷然后依次用va_arg宏使arg_ptr返回可变参数的地址,得到这个地址之后,结合参数的类型,就可以得到参数的值。然后进行输出。
  ⑸设定结束条件,这里的条件就是判断参数值是否为-1。注意被调的函数在调用时是不知道可变参数的正确数目的,程序员必须自己在代码中指明结束条件
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

stephenliu89

银虫 (小有名气)



小木虫(金币+0.5):给个红包,谢谢回帖交流
受教了啊!貌似谭浩强可没说过这个。。。
2楼2010-09-05 12:09:42
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

★★★★★ 五星级,优秀推荐

顶老汉!
3楼2010-09-05 17:18:16
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

magic7004

金虫 (职业作家)


★★★ 三星级,支持鼓励


余泽成(金币+1):鼓励参与讨论! 2010-09-06 11:05:49
不过貌似现在的编程中,可变参数是不推荐使用的,因为这玩意儿不是类型安全的。

其实可变参数能实现的功能,都可以用数组(或指针)代替的。
4楼2010-09-06 09:05:43
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 yalefield 的主题更新
☆ 无星级 ★ 一星级 ★★★ 三星级 ★★★★★ 五星级
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 312求调剂 +18 gtw1 2026-04-06 20/1000 2026-04-07 18:16 by 蓝云思雨
[考研] 280求调剂 +7 李rien 2026-04-04 7/350 2026-04-07 17:33 by 蓝云思雨
[考研] 一志愿北京化工085600 310分求调剂 +20 0856材料与化工3 2026-04-04 22/1100 2026-04-07 15:14 by 上岸快快
[考研] 304求调剂 +14 c297914 2026-04-05 15/750 2026-04-07 11:15 by 诗与自由
[考研] 277工科求调剂 +10 1915668 2026-04-04 11/550 2026-04-06 23:53 by 心媛意北
[考研] 生物学调剂 可调剂到生物与医药 +3 李政莹 2026-04-06 3/150 2026-04-06 19:02 by macy2011
[考研] 生物学学硕求调剂:351分一志愿南京师范大学生物学专业 +6 …~、王…~ 2026-04-06 7/350 2026-04-06 18:54 by macy2011
[考研] 0703化学调剂325分 +12 15771691647 2026-04-04 13/650 2026-04-06 12:00 by lijunpoly
[考研] 材料专硕(0856) 339分求调剂 +10 哈哈哈鹅哈哈哈 2026-04-04 10/500 2026-04-05 18:51 by 蓝云思雨
[考研] 323求调剂 +8 李佳乐1 2026-04-04 8/400 2026-04-04 22:26 by hemengdong
[考研] 283求调剂 +4 mcbbc 2026-04-03 5/250 2026-04-04 20:51 by imissbao
[考研] 材料专业383求调剂 +8 郭阳阳阳成 2026-04-03 8/400 2026-04-04 10:29 by Rednal.
[考研] 336求调剂 +8 kiyy 2026-04-01 8/400 2026-04-03 19:41 by lijunpoly
[基金申请] esi高被引论文是不是能对中标有所加分和帮助呢 +5 redcom 2026-04-01 6/300 2026-04-03 15:15 by Howard28
[考研] 315分 085602 求调剂 +15 26考研上岸版26 2026-04-02 15/750 2026-04-03 12:45 by xingguangj
[考研] 316求调剂 +14 舟自梗 2026-04-01 18/900 2026-04-03 10:28 by linyelide
[考研] 能源动力 调剂 +3 不破不立0 2026-04-02 3/150 2026-04-02 12:46 by ffffjjjj
[考研] 材料专硕322分 +11 哈哈哈吼吼吼哈 2026-04-01 11/550 2026-04-02 10:52 by lnilvy
[考研] 求调剂0703 +5 周嘉尧 2026-03-31 8/400 2026-04-01 20:32 by ltltkkk
[硕博家园] 考研调剂 +5 骆驼男人 2026-04-01 5/250 2026-04-01 14:28 by syjjj0321
信息提示
请填处理意见