当前位置: 首页 > news >正文

C语言之 认识可变参数

  printf()的原型是int printf(const char *fmt, ...);后面三个 . 表示C语言的变参。

  那么什么是变参?它有什么功能和作用呢?

  变参就是参数不确定,可以随意根据需要来改变的参数。

  我们先举一个固定参数列表的函数:

int swap(int a,int b)

{

   int c;

   c=a;

   a=b;

   b=c;

   return a; 

}

  这是随便写的一个函数,虽然由于里面全都是局部变量的原因所以并不能交换参数,但是这个函数的形式还是挺不错的。

  再举例一个可变参数列表函数:

void names(int a , ...)

{

   ……

}

  反正只是定义一个而已,里面的内容就省略了。大家可以看到,下一个参数可以是任意的参数,但是局部变量可知,所有参数的值在调用时要被复制给栈中的连续内存,所以必须有一个普通变量来寻址后续的可变参数的类型和地址。

  也就是说,在使用C语言的变参时,需要将变参,也就是...放在最后一个参数的位置,并且变参前面至少要有一个普通的参数。

  这里有一个例子:

#include <stdarg.h>

#include <stdio.h>

 

void func1(const char * str1, ...) 

{

    char    *pp;

 

    pp = ((char*)&str1) + sizeof(str1); 

    printf("%d\n", *(int*)pp);  

        

    pp =  pp + sizeof(int);

    printf("%d\n", *(int*)pp);

 

    pp =  pp + sizeof(int);

    printf("%s\n", *((char**)pp));

}

 

int main()

{

    func1("%d %d %s\n", 4, 5, "hello world");

   return 0;

}

    这个函数其实是不对的,原因就是里面存在内存对齐这个问题,但是作为认识和了解可变参数已经足够了。

    这里的const char * str1实际上指向了一个待打印输出的字符串。

现在先了解到这里,以后真正用到的时候再详细讨论。

相关文章:

  • ARM cortex a 的SDRAM (DDR)
  • C语言 之递归函数
  • C语言 之建立静态链接库
  • ARM的PWM定时器1
  • RTC闹钟的中断处理方法以及程序设计
  • altium designer 制作元器件封装库
  • VTK的Mapper
  • VTK交互系统 1 交互模式入门
  • VTK显示像素图
  • VTK交互系统 2 交互器样式
  • VTK交互系统 3 自定义交互器样式
  • VTK交互系统 4 自定义交互器样式2 键盘鼠标交互器设置
  • Qt多线程1
  • Qt多线程2
  • 基于QT的文件管理软件编写 系列 引言
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • C++11: atomic 头文件
  • es的写入过程
  • happypack两次报错的问题
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • springboot_database项目介绍
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 给第三方使用接口的 URL 签名实现
  • 好的网址,关于.net 4.0 ,vs 2010
  • 京东美团研发面经
  • 使用parted解决大于2T的磁盘分区
  • 使用putty远程连接linux
  • 物联网链路协议
  • 中文输入法与React文本输入框的问题与解决方案
  • 自定义函数
  • MyCAT水平分库
  • ​​​​​​​​​​​​​​Γ函数
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #QT(TCP网络编程-服务端)
  • (1)(1.9) MSP (version 4.2)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (转)项目管理杂谈-我所期望的新人
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .“空心村”成因分析及解决对策122344
  • .CSS-hover 的解释
  • .Net - 类的介绍
  • .net 4.0发布后不能正常显示图片问题
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET Framework与.NET Framework SDK有什么不同?
  • .Net的DataSet直接与SQL2005交互
  • .net分布式压力测试工具(Beetle.DT)
  • .net和php怎么连接,php和apache之间如何连接
  • .NET企业级应用架构设计系列之应用服务器
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • ?
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法