1.可变参数产生原因

首先来看一个简单的例子。

int Add(int x, int y)
{return x + y;
}
int main()
{int sum = 0;sum = Add(1, 2);//sum = Add(1, 2, 3);//sum = Add(1);system("pause");return 0;
}

我们可以看到,对于这个代码只可以计算两个数的加法。
这样我们引入一个新的知识点!

可变参数实现求任意数的和

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>int Add(int num, ...)
{int sum = 0;va_list arg;va_start(arg, num);for (int i = 0; i < num; i++){sum += va_arg(arg, int);}va_end(arg);return sum;
}
int main()
{printf("%d\n", Add(4, 2, 3, 4, 5));system("pause");return 0;
}

详解

1.main()函数第一句
printf("%d\n", Add(4,     2, 3, 4, 5));

第一个4表示元素个数剩余表示元素内容

2.

操作符的含义:

1.

    va_list arg;
宏操作符 实际含义 详解
va_list char * va_list arg 创建一个字符指针arg,用于访问参数列表的未确定部分。

2.

    va_start(arg, num);

(ap=(va_list)&v + _INTSIZEOF(v))

宏操作符 实际含义 详解
va_start (ap,v) (ap=(va_list)&v + _INTSIZEOF(v)) 初始化变量arg ,va_start有两个参数,它的第一个参数是va_list所创建的字符指针。第2个参数是“…”之前的那个参数;(不可以读省略号)
va_start (arg,num) (arg=(char *)&v + _INTSIZEOF(num))
_INTSIZEOF (sizeof(n) + sizeof(int)-1 & ~(sizeof(int)-1) 跳过num,来到位置参数的第一个参数。向上取四的整数倍

3.

    for (int i = 0; i < num; i++){sum += va_arg(arg, int);}
宏操作符 实际含义 详解
va_arg(ap,t) (*(t*)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t))) (*(t*)((arg += _INTSIZEOF(int)) - _INTSIZEOF(int)))
(*(t*)((arg += _INTSIZEOF(int)) - _INTSIZEOF(int))) (*(int *)((arg += 4) - 4))
(arg += 4) - 4) arg; arg+=4; 先给arg加4再减,arg这次产生的结果没变,但是arg指向了下一个位置。一个代码做了两个动作
    for (int i = 0; i < num; i++){sum += va_arg(arg, int);}

取出所有未知参数,然后加给sum

宏操作符 实际含义 详解
va_end(ap) (ap = (va_list)0) 给指针赋值空指针。不用的时候释放
va_end(arg);

防止指针乱指用完一定要释放。

C语言 浅谈可变参数相关推荐

  1. c语言理解参数,c语言中对可变参数列表的简单理解

    函数原型中一般情况下参数的数目是固定的,但是如果想在不同的时候接收不定数目的参数时该怎么办呢?c语言提供了可变参数列表来实现. 可变参数列表是通过宏来实现的,这些宏定义在stdarg.h的头文件中.头 ...

  2. C语言中函数可变参数解析

    大多数时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数.但在某些情况下希望函数的参数个数可以根据需要确定.典型的例子有 大家熟悉的函数printf().scanf ...

  3. 编写可变参数函数 c语言,C语言中编写可变参数函数

    通过stdarg.h头文件为函数提供了定义可变参数列表的能力.声明一个可变参数的函数类似: void f1(int n,...); 其中n表示参数列表个数,而用省略号来表示未知参数列表.stdarg. ...

  4. 【转载】c语言中的可变参数编程

    在c语言中使用变长参数最常见的就是下面两个函数了: int printf(const char *format, ...);int scanf(const char *format, ...); 那他 ...

  5. 【嵌入式】C语言高级编程-可变参数宏(12)

    00. 目录 文章目录 00. 目录 01. 可变参数宏概述 02. ##符号 03. 可变参宏另外一种写法 04. 内核中的可变参数宏 05. 附录 01. 可变参数宏概述 #include < ...

  6. 【C/C++开发】C语言实现函数可变参数

    函数原型: int printf(const char *format[,argument]...)        返 回 值: 成功则返回实际输出的字符数,失败返回-1.  函数说明:        ...

  7. 从printf谈可变参数函数的实现

    作者:戎亚新 摘要:一直以来都觉得printf似乎是c语言库中功能最强大的函数之一,不仅因为它能格式化输出,更在于它的参数个数没有限制,要几个就给几个,来者不拒.printf这种对参数个数和参数类型的 ...

  8. 【C语言进阶深度学习记录】三十九 C语言中的可变参数(参数可变的函数)

    用过printf()函数的热都知道,printf的参数可以有多个,它是可变的,根据我们输出参数的类型以及个数的不同来确定参数.今天来学习C语言中参数可变的函数是如何实现的. 文章目录 1 可变参数 2 ...

  9. C语言学习笔记---可变参数

      在C语言中有些函数传递进入的参数数量是不固定的,最常见的就是 printf() 函数,它就是利用可变参数来实现任意格式的数据打印功能. 我们自己也可以编写一个参数可变的函数,每次动态的检测传入的参 ...

最新文章

  1. 春天闻香食花——品尝一顿愉悦的花餐
  2. 半年总结(2018-10)
  3. 时序数据库InfluxDB
  4. MongoDB基础--数据库和集合基本操作
  5. hashmap为什么线程不安全_什么时候线程不安全?怎样做到线程安全?怎么扩展线程安全的类?...
  6. Spring Boot进阶之Web进阶 代码推送的github上面去
  7. 纪念品分组(洛谷-P1094)
  8. [Linux源码分析]内存管理
  9. 【转】Xposed+JustTrustMe关闭SSL证书验证解决无法抓取https包问题
  10. ffmpeg java 实时视频流转码
  11. 使用bat命令快速创建系统还原点的方法
  12. 2、sudo时候出现no valid sudoers sources found, quitting
  13. MS-DOC 文件格式概述
  14. 中拓互联携手企信易为企业构建信息,传递信任
  15. 谈谈小弟最近暗自干些什么勾当(LGame WP版开发进度汇报)
  16. java 将 object转成Integer
  17. 【其他】接口设计文档模板
  18. response响应头设置总结
  19. 杂乱无章之Oracle(一)
  20. 盛世昊通微达国际联合出品《天下无拐》,还孩子们一片蓝天

热门文章

  1. HTMLCSS 问题
  2. 键盘keydown值表
  3. SpringFox swagger2 and SpringFox swagger2 UI 接口文档生成与查看
  4. 【洛谷】【二分答案+最短路】P1462 通往奥格瑞玛的道路
  5. VisualVM介绍使用
  6. mxnet系列教程之1-第一个例子
  7. h.264 去块滤波
  8. android 处理鼠标滚轮事件 【转】
  9. iframe高度自适应(IE6+、FF、Opera、Chrome等测试通过)
  10. centos7 python3安装numpy_centos 7 下安装numpy、scipy等python包