24小时热门版块排行榜    

Znn3bq.jpeg
查看: 592  |  回复: 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 的主题更新
☆ 无星级 ★ 一星级 ★★★ 三星级 ★★★★★ 五星级
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 国自然面上和省基金B类撒花 +11 花田半亩~白 2026-04-21 11/550 2026-04-22 18:21 by maolC
[教师之家] 又一批高校组建人工智能学院 师资行吗 不是骗人吗 +5 yexuqing 2026-04-19 5/250 2026-04-22 10:01 by easeheart
[论文投稿] 急需审稿人!!! +3 陆小果画大饼 2026-04-21 3/150 2026-04-21 23:54 by jzy_123456
[考博] 申博/考博 +4 啃面包的小书虫 2026-04-17 8/400 2026-04-21 16:26 by 啃面包的小书虫
[考研] 295分求调剂 +6 ?要上岸? 2026-04-17 6/300 2026-04-21 08:18 by Equinoxhua
[考研] 一志愿中科大材料与化工,353分还有调剂学校吗 +11 否极泰来2026 2026-04-15 13/650 2026-04-20 22:31 by Equinoxhua
[考研] 085600材料与化工调剂 5+3 孜孜不倦2002 2026-04-19 6/300 2026-04-20 21:25 by babero
[论文投稿] 有没有接收比较快的sci期刊呀,最好在一个月之内的,研三孩子求毕业 20+4 之护着 2026-04-16 7/350 2026-04-20 15:45 by 豆豆7758
[考研] 337求调剂 +3 jyz04 2026-04-18 3/150 2026-04-20 12:24 by 研可安
[考博] 申博 +3 Xyyx. 2026-04-18 3/150 2026-04-20 10:44 by YuY66
[考博] 湖南大学刘巧玲课题组2026年第二批次博士研究生招生信息 +3 南风观火 2026-04-18 5/250 2026-04-20 10:13 by 南风观火
[考研] 求计算机方向调剂 +3 Toffee2 2026-04-16 6/300 2026-04-19 22:37 by ll叶
[考研] 294求调剂 +8 淡然654321 2026-04-17 9/450 2026-04-19 19:51 by Equinoxhua
[考研] 304求调剂 +8 castLight 2026-04-16 8/400 2026-04-19 17:14 by 中豫男
[考研] 求调剂 +10 小聂爱学习 2026-04-16 12/600 2026-04-19 16:51 by 中豫男
[考研] 求调剂 +6 苦命人。。。 2026-04-18 7/350 2026-04-19 16:27 by 中豫男
[考研] 300求调剂 +12 橙a777 2026-04-15 12/600 2026-04-18 23:51 by 路病情
[考研] 收到复试调剂但是去不了 +8 小蜗牛* 2026-04-16 8/400 2026-04-18 11:15 by zixin2025
[考研] 260求调剂 +4 Zyt1314520.. 2026-04-17 5/250 2026-04-18 08:28 by babysonlkd
[考研] 322求调剂 +6 tekuzu 2026-04-17 6/300 2026-04-17 13:48 by Espannnnnol
信息提示
请填处理意见