C语言 函数不定长参数

ChatGPT 3.5 国内中文镜像站免费使用啦

零基础 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++)/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语言 函数不定长参数

ChatGPT 3.5 国内中文镜像站免费使用啦
© 版权声明
THE END
喜欢就支持一下吧
点赞2 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容