61.C语言 函数不定长参数

最后更新于:2020-11-18 15:09:58

一.前言

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 案例一

/************************************************************************/
/*@文件名      : va_start/va_arg/va_end.cpp                                                       
/*@日  期      : 2020/10/14 21:52
/*@作  者      : 猿说编程 
/*@公众号      : 猿说编程
/*@博客        : www.shuopython.com
/*@描述        : C语言教程 - va_start/va_arg/va_end宏
/************************************************************************/

#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 案例二

/*
/************************************************************************/
/*@文件名      : va_start/va_arg/va_end.cpp                                                       
/*@日  期      : 2020/10/14 21:52
/*@作  者      : 猿说编程 
/*@公众号      : 猿说编程
/*@博客        : www.shuopython.com
/*@描述        : C语言教程 - va_start/va_arg/va_end宏
/************************************************************************/

#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. 三目运算符

2. 逗号表达式

3. char和wchar_t相互转换

4. wprintf输出中文乱码

5. unicode和多字节区别

6. Debug和_DEBUG区别

7. Debug和Release区别

8. _WIN32/WIN32/_WIN64/WIN64区别

9. memcpy/strcpy/strcpy_s区别

10. NaN(Not a Number)

11. INF:infinite)



转载请注明: 猿说编程 »C/C++教程 »函数不定长参数

赞赏

微信赞赏支付宝赞赏