C 可变参数

C语言中的可变参数(variable arguments)是一种特殊的参数类型,可以允许函数接受不确定数量的参数。可变参数的使用需要引入 C 标准库的stdarg.h头文件,并且需要使用固定格式的函数。

可变参数函数的定义

可变参数函数的定义需要以下三个步骤:

  1. 定义函数传入的最后一个参数,以便在函数中定位可变参数的起始位置。

C
int function_name(int par1, int par2, ...)
{
...
}

  1. 定义va_list类型变量,在函数内部使用va_start初始化它。

C
va_list ap;
va_start(ap, p2);

va_start函数的第二个参数是可变参数列表的前一个参数,用于确定参数列表的位置,即可变参数的开始位置。返回的指针将指向此参数(也就是第一个可变参数的位置)。

  1. 使用va_arg宏读取可变参数的值,并使用va_end释放ap。

C
int value1 = va_arg(ap, int); // 读取第一个可变参数
double value2 = va_arg(ap, double); // 读取第二个可变参数
...
va_end(ap);

可变参数函数的调用

可变参数函数调用需要按照三个步骤执行:

  1. 使用函数名和其他参数列表调用函数:

C
result = function_name(p1, p2, ...);

  1. 在需要多传递参数的位置传递额外的参数。

C
result = function_name(p1, p2, p3, p4, ...);

3.保证在固定参数之后传递的所有参数都是该函数期望接收的类型的参数。

示例1:计算可变参数的平均值

#include <stdarg.h>
#include <stdio.h>

double average(int num, ...)
{
    va_list valist;
    double sum = 0.0;
    int i;
    va_start(valist, num);
    for (i = 0; i < num; i++)
    {
        sum += va_arg(valist, int);
    }
    va_end(valist);
    return sum / num;
}

int main()
{
    printf("Average of 2,3,4,5 = %f\n", average(4, 2, 3, 4, 5));
    printf("Average of 5,10,15 = %f\n", average(3, 5, 10, 15));
    return 0;
}

输出:

Average of 2,3,4,5 = 3.500000
Average of 5,10,15 = 10.000000

示例2:字符串连接

#include<stdlib.h>
#include<stdarg.h>
#include<stdio.h>

char* concat(int count, ...)
{
    va_list args;
    va_start(args, count);

    size_t len = 1;
    for (int i = 0; i < count; i++) {
        len += strlen(va_arg(args, char*));
    }

    char* new_str = (char*)malloc(len * sizeof(char));

    va_start(args, count);
    new_str[0] = '\0';
    for (int i = 0; i < count; i++) {
        strcat(new_str, va_arg(args, char*));
    }

    va_end(args);
    return new_str;
}

int main()
{
    char *s1 = "Hello";
    char *s2 = " World";
    char *s3 = "!";
    char *result = concat(3, s1, s2, s3);
    printf("%s\n", result);
    free(result);
    return 0;
}

输出:

Hello World!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C 可变参数 - Python技术站

(0)
上一篇 2023年5月10日
下一篇 2023年5月10日

相关文章

  • C语言实现简易的三子棋小游戏

    C语言实现简易的三子棋小游戏 概述 本文将讲解如何使用C语言编写一个简易的三子棋小游戏,涉及到的编程知识包括二维数组、循环结构、条件语句等基本概念。 实现步骤 1. 创建游戏棋盘 我们可以使用一个三行三列的二维数组来表示游戏的棋盘,初始化的时候将数组元素全部赋值为空格即可。 示例代码: char board[3][3] = { {‘ ‘, ‘ ‘, ‘ ‘}…

    C 2023年5月23日
    00
  • c++对象内存布局示例详解

    首先,让我们来了解一下C++对象的内存布局。在实际编程中,我们经常会涉及到创建对象,并根据对象来进行操作。因此,了解对象在内存中所占的布局情况,对于有效地管理内存使用以及提高代码执行效率都很有帮助。 C++对象内存布局包括以下三个部分: 对象的数据成员 对象的虚函数表指针 (vptr) 对象的填充字节 数据成员是对象实际存储数据的部分,虚函数表指针用于处理虚…

    C 2023年5月22日
    00
  • C语言实现简易扑克牌游戏

    C语言实现简易扑克牌游戏攻略 本文将详细讲解如何用C语言实现简单的扑克牌游戏,整个游戏的流程包括洗牌、发牌、比大小等。下面将分四个部分进行介绍。 一、洗牌 洗牌是将扑克牌随机打乱的过程,最终目的是使得牌的顺序变得不可预测。在C语言中实现洗牌,可以采用如下步骤: 定义一个数组存放一副扑克牌的编号,例如包括1到52(表示52张牌)的整数,顺序排列。 int po…

    C 2023年5月23日
    00
  • Go项目中添加生成时间与版本信息的方法

    在Go项目中添加生成时间与版本信息,可以通过在编译时动态添加这些信息到可执行文件中,运行后即可查看。以下是完整的攻略。 第一步:定义版本信息 在项目的主程序中,定义一个常量来保存版本信息和生成时间。版本信息可以格式化成字符串,并随着时间一起更新。 const ( Version = "1.0" BuildTime = "2019…

    C 2023年5月22日
    00
  • Python JSON格式数据的提取和保存的实现

    下面是“Python JSON格式数据的提取和保存的实现”的完整攻略。 JSON格式概述 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON使用Unicode字符集,支持数字、字符串、布尔值、null、数组和对象,具有较高的可读性。 提取JSON数据 在Python…

    C 2023年5月23日
    00
  • JpaRepository 实现简单条件查询

    当我们使用 Spring Data JPA 来进行数据库访问时,可以使用 JpaRepository 进行数据的增删改查等操作,其中包括一些常见的条件查询方法。本篇攻略将详细讲解如何在 JpaRepository 中实现简单条件查询。 环境准备 在开始之前,请确保你已经满足以下环境要求: 已开发好 JPA 的基本环境; 已定义好实体类和 Repository…

    C 2023年5月23日
    00
  • VSCode launch.json配置详细教程

    首先,我们需要了解什么是VSCode的launch.json文件。launch.json是配置VSCode调试器的文件,在这个文件中,我们可以设置如何运行我们的代码、哪些文件需要调试、以及如何传递命令行参数等等。 接下来,让我们通过以下步骤创建一个新的launch.json文件: 在VSCode中打开你的项目文件夹。 打开调试器工具栏。(快捷键F5) 在工具…

    C 2023年5月23日
    00
  • C++设计模式之代理模式(Proxy)

    C++设计模式之代理模式(Proxy) 代理模式是一种结构型设计模式,它允许将对象的访问控制在另一个对象中,从而在访问对象时提供间接的方式。代理模式允许我们通过使用另一个对象来代表实际的对象来控制对实际对象的访问。 适用场景 在以下情况下使用代理模式: 当直接访问对象可能会危及对象的安全时。 当访问一个对象需要很长时间时,因为每次访问都需要进行复杂的计算,而…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部