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日

相关文章

  • mysql5.7.21安装配置教程

    MySQL 5.7.21安装配置教程 MySQL是一款功能强大的关系型数据库管理系统,广泛用于Web开发、企业应用等领域。本教程将介绍如何在Windows操作系统上安装配置MySQL 5.7.21版本。 安装MySQL 打开MySQL官网下载页面下载MySQL Community Server 5.7.21版本的安装程序。 运行安装程序,选择Custom选项…

    C 2023年5月22日
    00
  • C语言模拟实现库函数详解

    C语言模拟实现库函数详解 1. 什么是库函数? 库函数(也称为系统函数)是一组能够被程序员调用的函数库,它包含了许多常用的功能函数。C语言本身只提供了一些基本的语法和数据类型,必须通过调用库函数来进行更高级的操作,如打印信息、内存操作、文件操作等等。 2. C语言模拟实现库函数好处 通过自己实现库函数,可以更深入地了解函数的实现原理,加深对C语言的理解。同时…

    C 2023年5月23日
    00
  • 基于C语言实现创意多彩贪吃蛇游戏

    基于C语言实现创意多彩贪吃蛇游戏 游戏规则 贪吃蛇游戏是一款经典的益智游戏,其规则如下: 蛇开始时只有一个身体,每当蛇吃到食物时,就会在尾部增加一个身体,同时加分。 蛇每格时间会自动向前移动一格,如果碰到边缘或者碰到自己的身体,则游戏结束。 为了避免蛇一直沿着一条直线前进导致游戏时间过短,游戏中会随机生成食物,蛇需要不断吃食物才能继续游戏。 游戏实现 在C语…

    C 2023年5月24日
    00
  • javascript eval和JSON之间的联系

    JavaScript eval 和 JSON 都是 JavaScript 中用于处理字符串的工具,但它们的设计目的和使用方式是不同的。本文将详细讲解它们之间的联系。 eval eval 函数是 JavaScript 内置的全局函数,可以将一个字符串解析为 JavaScript 代码,并将其执行。我们可以将任何有效的 JavaScript 表达式作为 eval…

    C 2023年5月23日
    00
  • AE怎么安装并使用Plexus插件? ae特效plexus的用法

    下面是安装并使用Plexus插件的完整攻略: 1. 下载并安装Plexus插件 Plexus插件是一款AE特效插件,需从AE插件市场或者其他资源网站下载。下载下来的插件应该是一个.zxp文件,需要使用Adobe Extension Manager将其安装到AE中。 2. 安装Adobe Extension Manager 如果你已经安装了Adobe Crea…

    C 2023年5月22日
    00
  • 在ASP.NET 2.0中操作数据之三十八:处理BLL和DAL的异常

    在ASP.NET 2.0中操作数据之三十八:处理BLL和DAL的异常是一个重要的主题,对于开发者很有帮助。在开发应用程序时,处理异常是一个必要的过程,可以帮助我们检测和修复代码中的错误,提高程序的健壮性和可靠性。 异常处理的重要性 在应用程序开发中,异常处理非常重要。当应用程序发生异常,如果没有进行任何处理,程序将会停止运行,给用户带来极不好的使用体验。此时…

    C 2023年5月23日
    00
  • 老生常谈C语言动态函数库的制作和使用(推荐)

    老生常谈C语言动态函数库的制作和使用(推荐) 什么是动态函数库 动态函数库也被称为动态链接库或共享对象。它是在程序运行时加载的一组可重定位的代码和数据的集合,可以被多个程序共享。动态函数库具有以下优点: 节省内存和磁盘空间; 更容易进行程序的升级和维护; 允许程序执行时加载库; 可以用来实现插件化。 制作动态函数库 编写动态函数库源文件 动态函数库源文件的后…

    C 2023年5月23日
    00
  • 如何寻找数组中的第二大数

    如何寻找数组中的第二大数是一个比较常见的问题。下面我将为大家详细讲解如何寻找数组中的第二大数的完整攻略。 1. 题目理解 首先需要明确题目的意思。题目所说的数组是一个由整数组成的序列。其次,题目要求找到数组中第二大的数,也就是说要找到所有元素中第二大的数。 2. 方法总结 如何在一个数组中找到第二大的数呢?下面是一些比较常见的方法: 方法一:排序 排序是一种…

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