C语言 浅谈可变参数
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语言 浅谈可变参数相关推荐
- c语言理解参数,c语言中对可变参数列表的简单理解
函数原型中一般情况下参数的数目是固定的,但是如果想在不同的时候接收不定数目的参数时该怎么办呢?c语言提供了可变参数列表来实现. 可变参数列表是通过宏来实现的,这些宏定义在stdarg.h的头文件中.头 ...
- C语言中函数可变参数解析
大多数时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数.但在某些情况下希望函数的参数个数可以根据需要确定.典型的例子有 大家熟悉的函数printf().scanf ...
- 编写可变参数函数 c语言,C语言中编写可变参数函数
通过stdarg.h头文件为函数提供了定义可变参数列表的能力.声明一个可变参数的函数类似: void f1(int n,...); 其中n表示参数列表个数,而用省略号来表示未知参数列表.stdarg. ...
- 【转载】c语言中的可变参数编程
在c语言中使用变长参数最常见的就是下面两个函数了: int printf(const char *format, ...);int scanf(const char *format, ...); 那他 ...
- 【嵌入式】C语言高级编程-可变参数宏(12)
00. 目录 文章目录 00. 目录 01. 可变参数宏概述 02. ##符号 03. 可变参宏另外一种写法 04. 内核中的可变参数宏 05. 附录 01. 可变参数宏概述 #include < ...
- 【C/C++开发】C语言实现函数可变参数
函数原型: int printf(const char *format[,argument]...) 返 回 值: 成功则返回实际输出的字符数,失败返回-1. 函数说明: ...
- 从printf谈可变参数函数的实现
作者:戎亚新 摘要:一直以来都觉得printf似乎是c语言库中功能最强大的函数之一,不仅因为它能格式化输出,更在于它的参数个数没有限制,要几个就给几个,来者不拒.printf这种对参数个数和参数类型的 ...
- 【C语言进阶深度学习记录】三十九 C语言中的可变参数(参数可变的函数)
用过printf()函数的热都知道,printf的参数可以有多个,它是可变的,根据我们输出参数的类型以及个数的不同来确定参数.今天来学习C语言中参数可变的函数是如何实现的. 文章目录 1 可变参数 2 ...
- C语言学习笔记---可变参数
在C语言中有些函数传递进入的参数数量是不固定的,最常见的就是 printf() 函数,它就是利用可变参数来实现任意格式的数据打印功能. 我们自己也可以编写一个参数可变的函数,每次动态的检测传入的参 ...
最新文章
- 春天闻香食花——品尝一顿愉悦的花餐
- 半年总结(2018-10)
- 时序数据库InfluxDB
- MongoDB基础--数据库和集合基本操作
- hashmap为什么线程不安全_什么时候线程不安全?怎样做到线程安全?怎么扩展线程安全的类?...
- Spring Boot进阶之Web进阶 代码推送的github上面去
- 纪念品分组(洛谷-P1094)
- [Linux源码分析]内存管理
- 【转】Xposed+JustTrustMe关闭SSL证书验证解决无法抓取https包问题
- ffmpeg java 实时视频流转码
- 使用bat命令快速创建系统还原点的方法
- 2、sudo时候出现no valid sudoers sources found, quitting
- MS-DOC 文件格式概述
- 中拓互联携手企信易为企业构建信息,传递信任
- 谈谈小弟最近暗自干些什么勾当(LGame WP版开发进度汇报)
- java 将 object转成Integer
- 【其他】接口设计文档模板
- response响应头设置总结
- 杂乱无章之Oracle(一)
- 盛世昊通微达国际联合出品《天下无拐》,还孩子们一片蓝天