C语言之可变参函数

1、什么是可变参函数

(1)在C语言里,可变参函数(variadic function)指的是可以接受个数不确定、类型也不完全固定的参数的函数。

(2)最典型的例子就是标准库里的printf / scanf家族。

2、头文件与 4 个必备的宏

复制代码
#include <stdarg.h>

stdarg.h 里提供了 4 个宏:

(1)va_list ap;

  • 声明一个"参数指针"变量。

(2)va_start(ap, last);

  • 把 ap 指向第一个可变参数;
  • last 必须是函数形参中最后一个"固定参数"。

(3)va_arg(ap, type);

  • 取出一个 type 类型的值,同时 ap 自动后移。

(4)va_end(ap);

  • 清理,必须与 va_start 成对出现

(5)C99 又补充了 va_copy(va_list dst, va_list src);

  • 用于拷贝遍历状态。

3、示例代码

复制代码
#include <stdio.h>
#include <stdarg.h>

int Sum(int count, int data, ...)
{
    int sum = data;          /* 第一个数已拿到 */
    va_list ap;
    va_start(ap, data);      /* 从第二个数开始遍历 */

    for (int i = 1; i < count; ++i)
    {
        sum += va_arg(ap, int);
    }
        
    va_end(ap);

    return sum;
}

int main(void)
{
    printf("Sum = %d\n", Sum(5, 10, 20, 30, 40, 50)); /* 5 个数:10+20+30+40+50 */
    return 0;
}

4、原理

(1)如下函数:参数a、b、c在内存中的地址是递增的。如果数据类型相同,当我们知道了a的地址,也就可以知道b和c了,也就可以访问b和c了。

复制代码
int add(int a, int b, int c);

(2)如下函数:如果知道了起始参数a的地址,和后续参数的类型,就可以得到后续参数的内存地址,便可以访问了。

  • 参数传入char类型,会被提升为int类型;

  • 所以说可变参数函数中至少需要一个确定的参数。

    int add(int a, ...);

相关推荐
第九序言T8 小时前
Python 数据处理进阶(十八)批量处理同结构文件:一个文件夹一次跑完
开发语言·python·自动化·pandas·数据处理
龙亘川9 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
程序喵大人9 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
Raas10010 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
专注仿真11 小时前
线性回归和逻辑回归算法详解
开发语言·人工智能·python·大模型训练·控制算法
jimy111 小时前
C++ 中的 `T&&`:右值引用与转发引用
开发语言·c++
呆呆虫1212 小时前
用 orjson 加速 SerpBase 响应解析:基准对比与注意事项
开发语言·php
心疼你的一切12 小时前
Python自动发邮件实战定时发报表
大数据·开发语言·python
Zwawa13 小时前
串口为什么会丢字节:从轮询到中断和环形缓冲区
c语言·单片机·嵌入式
Wang's Blog13 小时前
Java 项目实战:交友项目 - 用户体系集成总结
java·开发语言·交友