C语言 函数不定长参数

Posted 猿说编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 函数不定长参数相关的知识,希望对你有一定的参考价值。

目录

零基础 Python 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门

一.前言

printf 函数的使用,我们并不陌生,首先我们来看看下面关于 printf 函数的几种调用方式:

printf("hello world");
printf("%s","hello world");
printf("%s %s","hello world","C语言教程-猿说编程");
printf("%d",3);
printf("%d %d",3,6);
printf("%d %d %d ",1,2,3);

灵魂拷问:

  • 1.printf 函数到底参数是什么类型?
  • 2.printf 函数到底有几个参数?

二.函数不定长参数简介

关于 C 语言不定长参数使用,必然离不开三个宏:va_startva_argva_end

#include <stdarg.h>
#define va_start __crt_va_start
#define va_arg   __crt_va_arg
#define va_end   __crt_va_end

1.va_start

#include <stdarg.h>//必须包含头文件
/*
*   arg_ptr 指向函数参数列表中的第一个可选参数
*   argN  是位于第一个可选参数之前的固定参数, 或者说最后一个固定参数
*/
va_start(arg_ptr, argN)

2.va_arg

#include <stdarg.h>//必须包含头文件
/*
*   返回参数列表中指针arg_ptr所指的参数, 返回类型为type.
*   并使指针arg_ptr指向参数列表中下一个参数.
*   返回的是可选参数, 不包括固定参数.
*/
va_arg(arg_ptr, type)

3.va_end

#include <stdarg.h>//必须包含头文件
/*
*   清空参数列表, 并置参数指针arg_ptr无效.
*/
va_end(arg_ptr)

三.自定义不定长参数的函数

1.va_start/va_arg/va_end 案例一

/************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言 函数不定长参数
//@Time:2021/06/23 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/************************************************************************/

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

void WriteFrmtd(char *format, ...)
{
   va_list args;
   va_start(args, format);
   vprintf(format, args);
   va_end(args);
}
int main ()
{
   WriteFrmtd("%d variable argument\\n", 1);
   WriteFrmtd("%d variable %s\\n", 2, "arguments");
   return(0);
}
输出:
1 variable argument
2 variable arguments

2.va_start/va_arg/va_end 案例二

/************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言 函数不定长参数
//@Time:2021/06/23 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/************************************************************************/

#include "stdafx.h"
#include <stdio.h>
#include <stdarg.h>
//c参数类型,参数个数不确定。
//自定义方法
int Sum(int Num, ...)
{
    int S = 0, T;
    va_list ap;
    va_start(ap, Num);
    for (int i = 0; i<Num; ++i)
    {
        T = va_arg(ap, int); S += T;
    }
    return S;
}
void myPrintf(int Num, ...)
{
    va_list ap;
    va_start(ap, Num);
    for (int i = 0; i<Num; i++)
    {
        //va_arg 返回值是不固定参数,所以第一个值是"dsdsdss"并非2
        char *T = va_arg(ap, char*);
        printf("myPrintf:%s\\n", T);
    }
}
int main()
{
    int n;
    myPrintf(2, "dsdsdss", "sdaddd");
    printf("%d\\n", Sum(10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
    return 0;
}
输出:
myPrintf:dsdsdss
myPrintf:sdaddd
55
*/

四.猜你喜欢

  1. C 语言逻辑运算符
  2. C 语言三目运算符
  3. C 语言逗号表达式
  4. C 语言 sizeof 和 strlen 函数区别
  5. C 语言 strcpy 和 strcpy_s 函数区别
  6. C 语言 memcpy 和 memcpy_s 区别
  7. C 语言 数组定义和使用
  8. C 语言 数组遍历
  9. C 语言 数组下标越界
  10. C 语言 数组内存溢出
  11. C 语言 数组下标越界和内存溢出区别
  12. C 语言 二维数组定义和使用
  13. C 语言 二维数组行数和列数计算
  14. C 语言 指针声明和定义
  15. C 语言 指针 p++ / p–
  16. C 语言 p++/§++/_(p++)/_p++
  17. C 语言 使用指针遍历数组
  18. C 语言 指针和数组区别
  19. C 语言 数组指针
  20. C 语言 指针数组
  21. C 语言 指针数组和数组指针区别
  22. C 语言 空指针 NULL
  23. C 语言 void 指针
  24. C 语言 野指针
  25. C 语言 函数声明和定义
  26. C 语言 函数声明和调用
  27. C 语言 函数值传递和址传递
  28. C 语言 函数缺省参数
  29. C 语言 函数不定长参数

未经允许不得转载:猿说编程 » C 语言 函数不定长参数

本文由博客 - 猿说编程 猿说编程 发布!

以上是关于C语言 函数不定长参数的主要内容,如果未能解决你的问题,请参考以下文章

C语言 函数不定长参数 ##__VA_ARGS__经典案例

C++不定参数

C语言--变长参数

Go语言:变参函数

C语言格式化输入不定长数组

44.不定长参数元组