zoukankan      html  css  js  c++  java
  • C语言函数不定参数实现方式

    函数如何实现不定参数:由于在C语言中没有函数重载,解决不定数目函数参数问题变得比较麻烦,即使采用C++,如果参数个数不能确定,也很难采用函数重载。对这种情况,提出了指针参数来解决问题。


    (1)va_list

    定义了一个指针arg_ptr, 用于指示可选的参数.

    (2)va_start(arg_ptr, argN)
    使参数列表指针arg_ptr指向函数参数列表中的第一个可选参数,argN是位于第一个可选参数之前的固定参数, 或者说最后一个固定参数.如有一va
    函数的声明是void va_test(char a, char b, char c, ...), 则它的固定参数依次是a,b,c, 最后一个固定参数argN为c, 因此就是va_start
    (arg_ptr, c).

    (3)va_arg(arg_ptr, type)
    返回参数列表中指针arg_ptr所指的参数, 返回类型为type. 并使指针arg_ptr指向参数列表中下一个参数.返回的是可选参数, 不包括固定参数.

    (4)va_end(arg_ptr)
    清空参数列表, 并置参数指针arg_ptr无效.
    (注:va在这里是variable-argument(可变参数)的意思.   这些宏定义在stdarg.h中,所以用到可变参数的程序应该包含这个头文件)

    以下以几个栗子来说明情况:

    例1:

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <stdarg.h>
     4 
     5 int print(const char *format, ...)
     6 {
     7     va_list args;
     8     const char *args1;
     9     va_start(args, format);
    10     args1 = va_arg(args,const char *);
    11     va_end(args);
    12     printf("format=%s args1=%s", format, args1);
    13 }
    14 int main()
    15 {
    16     print("11111", "22222");
    17 }

    运行结果:

    1 /*
    2 format=11111 args1=22222
    3 Process returned 24 (0x18)   execution time : 0.542 s
    4 Press any key to continue.
    5 */

    例2:

     1 例2:
     2 #include <stdio.h>
     3 #include <stdlib.h>
     4 #include <stdarg.h>
     5 
     6 int print(const char *format, ...)
     7 {
     8     va_list args;
     9     const char *args1;
    10     va_start(args, format);
    11     args1 = va_arg(args,const char *);
    12     va_end(args);
    13     printf("format=%s args1=%s", format, args1);
    14 }
    15 
    16 int main()
    17 {
    18     print("11111", "22222", "333333");
    19 }

    运行结果:

    1 /*
    2 format=11111 args1=22222
    3 Process returned 24 (0x18)   execution time : 0.542 s
    4 Press any key to continue.
    5 */

    我们从上面可以看见这样在函数中加入三个参数是没有问题的;

    例3:

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <stdarg.h>
     4 
     5 int print(const char *format, ...)
     6 {
     7     va_list args;
     8     const char *args1;
     9     va_start(args, format);
    10     args1 = va_arg(args, const char *);
    11     args2 = va_arg(args, const char *);
    12     va_end(args);
    13     printf("format=%s args1=%s", format, args1, args2);
    14 }
    15 
    16 
    17 int main()
    18 {
    19 
    20     print("11111", "23333");
    21 }

    运行结果:

    1 /*
    2 format=11111 args1=23333
    3 Process returned 24 (0x18)   execution time : 0.153 s
    4 Press any key to continue.
    5 
    6 */

    注意是上面并没有三个参数,但是程序还是可以运行起来的! 

    从上面三个例子可以看出我们传入的参数都是一个类型的参数;

    例4:

     不同类型的函数参数:

     1 int print(const char *format, ...)
     2 {
     3     va_list args;
     4     int args1;
     5     va_start(args, format);
     6     args1 = va_arg(args, int);
     7     va_end(args);
     8     printf("format=%s args1=%d", format, args1);
     9 }
    10 
    11 
    12 int main()
    13 {
    14 
    15     print("11111", 123);
    16 }

    运行结果:

    1 /*
    2 format=11111 args1=123
    3 Process returned 22 (0x16)   execution time : 0.007 s
    4 Press any key to continue.
    5 */


    但是注意不能使用:
    总之,va_arg(ap,type)中的type绝对不能为以下类型:
    ——char、signed char、unsigned char
    ——short、unsigned short
    ——signed short、short int、signed short int、unsigned short int
    ——float

     

  • 相关阅读:
    个人理财小助手 —— 简介
    我的分页控件(未完,待续)——控件件介绍及思路
    静态变量 静态对象 静态函数和非静态函数的区别。(我的理解,大家看看对不对)
    通过“访问多种数据库”的代码来学习多态!(.net2.0版)
    Step By Step 一步一步写网站[1] —— 填加数据
    个人理财小助手 —— 数据库(一)
    几个鸟叫的声音
    Step By Step 一步一步写网站[1] —— 帧间压缩,表单控件
    面向对象相关
    论程序的成长—— 你写的代码有生命力吗?
  • 原文地址:https://www.cnblogs.com/linhaostudy/p/6695422.html
Copyright © 2011-2022 走看看