C语言基础

    返回首页    发表留言
本文作者:李德强
          第三节 不定参数
 
 

        在这一节里我们来学习C语言中另外一个重要的机制,不定参数。不定参数是指函数可以接收不确定个数的参数,不定参数用...来表示,它必须要写在正常参数表的后面,例如我们熟知的printf函数:

int printf (char *fmt, ...);

        printf的第一个参数为char* fmt,后面则是不定参数。它表示可以接收任意个数的参数。我们在调用这样的函数时可以向其传与任意个数的参数,例如:

printf("%d %d\n", 1, 2);
printf("%f %f %f\n", 1.2, 2.3, 3.4);
printf("%d %f %c %s\n", 1, 2.3, 'A', "Hello World!");

        那么,我们不禁要问,定义了一个不定参数的函数,在函数体内如何确定其形参呢?如何取得传入参数的值呢?

        C语言中提供了一种可以获取不定参数的办法,就是用std_arg

        先来看看std_arg的使用例子:

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

int sum(int first, ...)
{
	va_list arg_list;
	int sum = first;
	va_start(arg_list, first);
	int var2 = va_arg(arg_list, int);
	int var3 = va_arg(arg_list, int);
	int var4 = va_arg(arg_list, int);
	int var5 = va_arg(arg_list, int);
	sum += var2;
	sum += var3;
	sum += var4;
	sum += var5;
	va_end(arg_list);
	return sum;
}

int main(int argc, char *argv[])
{
	printf("%d\n", sum(1, 2, 3, 4, 5));
	return 0;
}

        首先,我们要使用#include <stdarg.h>来包含这个使用否定参数的头文件。然后定义一个int类型的变量,我们需要使用va_start将函数的第一个参数传递给arg_list,这样它都才会知道其后面的不定参数。接下来使用va_arg来取得第二个参数值,在取值时需要将其强制转化为指定类型的变量。在这里我们是认为参数的类型均为int型,而通常来说我们可以向printf这样,将第一个参数做为后续不定参数的类型定义,通过分析fmt字符串中的类型来确定后续不定参数的类型。接下来我们通过va_arg再取得第三个参数、第四个参数和第五个参数。最后使用va_end结束不定参数的使用。

        当然,在定义函数和调用函数时我们都必须清楚函数的所有的参数类型,否则arglist将不能正常工作。

        关于arglist的原理有兴趣的读者请参见《函数栈帧》

 

    返回首页    返回顶部
  看不清?点击刷新

 

  Copyright © 2015-2023 问渠网 辽ICP备15013245号