打印

【转】C语言可变参数

[复制链接]
588|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一灯大神|  楼主 | 2016-12-22 13:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C语言可变参数



  可变参数C语言中很典型的函数就是printf了,可变参数,即函数参数数目不确定,在实际运用时有重要的作用。

  下面将逐步探究怎么实现可变参数。


方法一:

[cpp] view plain copy
print?


  • typedef  char* string;  
  • #define type string  
  • void function1(int len,...)  
  • {  
  •     int i;  
  •     va_list arg = NULL;  
  •     printf( "function1\n" );  
  •     va_start(arg, len); //将第一个可选参数地址赋予arg  
  •     for(i=0;i<len;i++)  
  •     {  
  •       printf("第%d个:%s\n",i,va_arg(arg, type));//以type类型的长度为基准获取下一个参数地址  
  •          
  •     }  
  •     va_end(arg);// 释放指针  
  • }  

测试:[cpp] view plain copy
print?


  • #include <stdio.h>  
  • #include <stdarg.h>  
  •   
  • ......  
  •   
  • void main()  
  • {  
  •     function1(3,"hello","world","hellworld");  
  • }  

可以通过改变type的类型实现对不同数据类型的操作,注意控制台输出时还要正确写出对应的%s或%c,%d


方法二:


[cpp] view plain copy
print?


  • stdarg.h头文件,有如下几个宏定义  
  • typedef char * va_list;  
  • #define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )  
  • #define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) //第一个可选参数地址  
  • #define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) //下一个参数地址  
  • #define va_end(ap) ( ap = (va_list)0 ) // 将指针置为无效  


我们可以不用这里的函数而自己来模拟实现

[cpp] view plain copy
print?


  • typedef  char* string;  
  • #define type string  
  • #define type2 int  
  • void function(int len,...)  
  • {  
  •     int i;  
  •     type *lst;  
  •     printf( "function\n" );  
  •     lst = (type*)((char*)&len+sizeof(type));  
  •     for(i=0;i<len;i++)  
  •     printf("第%d个:%s\n",i,lst);  
  •     //或者:  
  •     /*while(len--)
  •     {
  •         printf("%s\n",*lst++);
  •     }*/  
  •     lst=NULL; //释放指针  
  • }  
  • void function2(int len,...)  
  • {  
  •     int i;  
  •     type2 *lst;  
  •     printf( "function2\n" );  
  •     lst = (type2*)((char*)&len+sizeof(type2));  
  •     for(i=0;i<len;i++)  
  •     printf("第%d个:%d\n",i,lst);  
  •     lst=NULL; //释放指针  
  • }  


测试


[cpp] view plain copy
print?


  • #include <stdio.h>  
  •   
  • ......  
  •   
  • void main()  
  • {  
  •      function(3,"hello","world","hellworld");  
  •      function2(3,123,234,345);  
  • }  


相关帖子

沙发
baimiaocun2015| | 2016-12-22 22:59 | 只看该作者
参数的传递是很重要的一环节的

使用特权

评论回复
板凳
zhangbo1985| | 2016-12-25 19:36 | 只看该作者
这个对于形参的要求是很及时的。

使用特权

评论回复
地板
chuntian2016| | 2016-12-25 20:06 | 只看该作者
这个就是说的关于参数的指针引用方面的内容哈

使用特权

评论回复
5
1988020566| | 2016-12-25 20:43 | 只看该作者
单片机C语言包含这些吗?

使用特权

评论回复
6
1988020566| | 2016-12-25 20:44 | 只看该作者
内存的分配?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

65

主题

112

帖子

2

粉丝