C/C++语言函数参数里的“...”作用,va_list的使用(stdarg.h)
2023-09-11 14:14:44 时间
以Linux “man 手册”里的printf函数声明为例,谈谈我对C语言函数的可变参数的一点理解。
printf的函数声明如下:int printf(const char *format, …); 通常情况下,以这种形式声明的函数参数列表至少需要一个普通的函数参数,后面的省略号不表示省略,而是函数原型的一部分。
可变参数的实现方式:C语言头文件“stdarg.h”提供了一个数据类型va_list和三个带参数的宏(va_start,va_arg和va_end)。其中va_list的声明如下:typedef char* va_list; va_start使得va_list类型的vp指向第一个可选参数,va_arg返回参数列表的当前参数并使vp指向参数列表的下一个参数,va_end把vp指针清为NULL。
下面以自己编写的一段C/C++代码来验证以上实现方式:
实例:
// 求参数列表中可变参数的和(可指定个数)
//#include <iostream>
//#include <cstdarg>
#include <stdio.h>
#include <stdarg.h>
//求n个可变参数的和
int sum(int n, int j, ...)
{
printf ("n = %d, j = %d\n", n, j);
int s = 0;
int i = 0;
va_list vp;
va_start(vp, j); //使得vp指向第一个可选参数
for(i = 0; i < n; ++i)
{
int va = va_arg(vp, int);
//s += va_arg(vp, int);
s += va;
printf ("vp_arg() = %d\n", va);
printf ("s = %d\n", s);
}
va_end(vp);
return s;
}
int main()
{
int j = sum(4,3,2,3,4,5,6);
printf ("j = %d\n", j);
return 0;
}
结果:
n = 4, j = 3
vp_arg() = 2
s = 2
vp_arg() = 3
s = 5
vp_arg() = 4
s = 9
vp_arg() = 5
s = 14
j = 14
分析:
函数sum的功能是求前n个可变参数的和,所以对于函数调用“sum(4,3,2,3,4,5,6)”返回值应该为前4个可变参数的和,即为2+3+4+5=14。
输出结果: j=14
相关文章
- C++ 数据的封装 初始封装
- 托管C++线程锁实现 c++11线程池
- 利用C++的std::vector定义OpenCV的MAT数组的方法
- 给图像添加椒盐噪声后用均值滤波和中值滤波过滤椒盐噪声的C++-OpenCV代码
- List分割:等分成n个list;指定元素个数n等分
- 81 C++ - STL容器使用时机
- C++程序设计课程同步项目——简单程序设计任务
- 8086汇编与c++编译器就内存方面的感想
- C++中防止STL中迭代器失效——map/set等关联容器——vector/list/deque等序列容器—如何防止迭代器失效—即erase()的使用
- 《C++编程惯用法——高级程序员常用方法和技巧》——1.2 抽象模型间的关系
- 基于VC++ 语言穿件MFC图形编辑程序【100010539】
- 1028 List Sorting(简单题,C++中sort()函数的运用)
- c++之list的用法
- 为什么java里面经常作List判断的时候,既要判断list不为null,又要判断size>0呢?
- C++中的三种继承关系
- List does not exist. The page you selected contains a list that does not exist. It may have been deleted by another user
- 203、【栈与队列】leetcode ——剑指 Offer II 040. 矩阵中最大的矩形 / 85. 最大矩形:暴力+单调栈(C++/Pyhont版本)
- 浅谈C++ STL list 容器
- linq 把list分组为 List<List>
- 《Qt5.9 C++开发指南》
- The Definitive C++ Book Guide and List--reference
- 【C/C++】值传递和址传递区别解析
- (原)ubuntu中C++调用libotrch