C语言 可变参数的用法

问题:

设计一个可变的函数:int add(int num,...),将除num之外的其他参数进行累加。

 1 #include <stdio.h>
 2 #include <stdarg.h>    //相关函数都包含在这个头文件当中
 3
 4 int add(int num,...)
 5 {
 6     va_list arg_ptr;
 7     int nArgValue = 0;
 8     int sum = 0;
 9     va_start(arg_ptr, num);
10     for (int i=0; i<num; i++)
11     {
12         nArgValue=va_arg(arg_ptr, int);
13         sum+=nArgValue;
14     }
15     va_end(arg_ptr);
16
17     return sum;
18 }
19
20 int main(int argc, char **argv)
21 {
22     printf("%d\n", add(4,11,2,55,1));
23     return 0;
24 }

显示结果

69

使用顺序:

va_list arg_ptr;

va_start(arg_ptr,num);

va_arg(arg_ptr, int);

va_end(arg_ptr);

时间: 2024-08-23 20:22:51

C语言 可变参数的用法的相关文章

C语言——可变参数

http://blog.chinaunix.net/space.php?uid=25304914&do=blog&id=3066441 一.是什么 我们学习C语言时最经常使用printf()函数,但我们很少了解其原型.其实printf()的参数就是可变参数,想想看,我们可以利用它打印出各种类型的数据.下面我们来看看它的原型: int printf( const char* format, ...); 它的第一个参数是format,属于固定参数,后面跟的参数的个数和类型都是可变的(用三个点&

C语言可变参数函数实现原理

一.可变参数函数实现原理 C函数调用的栈结构: 可变参数函数的实现与函数调用的栈结构密切相关,正常情况下C的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈. 本文地址:http://www.cnblogs.com/archimedes/p/variable-parameter.html,转载请注明源地址. 例如,对于函数: void fun(int a, int b, int c) { int d; ... } 其栈结构为 0x1ffc-->d 0x200

转:C语言 可变参数

C语言 可变参数 堆栈一般是怎么压栈处理的 /* * stack space: * *        参数3   |    up *        参数2   | *        参数1   v    down */ 因为参数是按照从右向左依次压入的,所以后面参数的地址依次根据“%”处理即可.文章中start = (int*) &buffer即获取了最后入栈的参数地址(如果最后一个入栈参数为int类型,自己可以推算出倒数第二个参数的地址.) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  

C语言中可变参数的用法

前言 在C语言程序编写中我们使用最多的函数一定包括printf以及很多类似的变形体.这个函数包含在C库函数中,定义为 int printf( const char* format, ...); 除了一个格式化字符串之外还可以输入多个可变参量,如:    printf("%d",i);     printf("%s",s);    printf("the number is %d ,string is:%s", i, s); 格式化字符串的判断本章

C语言可变参数在宏定义中的应用

在C语言的标准库中,printf.scanf.sscanf.sprintf.sscanf这些标准库的输入输出函数,参数都是可变的.在调试程序时,我们可能希望定义一个参数可变的输出函数来记录日志,那么用可变参数的宏是一个不错的选择. 在C99中规定宏也可以像函数一样带可变的参数,如: #define LOG(format, ...) fprintf(stdout, format, __VA_ARGS__) 其中,...表示可变参数列表,__VA_ARGS__在预处理中,会被实际的参数集(实参列表)

C语言可变参数

转自http://www.cnblogs.com/wangyonghui/archive/2010/07/12/1776068.html,稍有改动 一.是什么 我们学习C语言时最经常使用printf()函数,但我们很少了解其原型.其实printf()的参数就是可变参数,想想看,我们可以利用它打印出各种类型的数据.下面我们来看看它的原型: int printf( const char* format, ...); 它的第一个参数是format,属于固定参数,后面跟的参数的个数和类型都是可变的(用三

Go语言 可变参数(变参函数)

合适地使用可变参数,可以让代码简单易用,尤其是输入输出类函数,比如日志函数等. 本文主要从4个实例介绍可变参数用法. 程序代码: package main import ( "bytes" "fmt" ) /****************** 1 **************** 定义可参变数函数 形如...type格式的类型只能作为函数的参数类型存在, 并且必须是最后一个参数,它是一个语法糖(syntactic sugar), 即这种语法对语言的功能并没有影响,

c语言可变参数列表处理

函数参数的传递原理 函数参数在内存中是以栈的形式存取,从右至左入栈. 参数在内存中存放格式: 在进程中,堆栈地址是从高到低分配的.当执行一个函数的时候,将参数列表入栈,压入堆栈的高地址部分,然后入栈函数的返回地址,接着入栈函数的执行代码,这个入栈过程,堆栈地址不断递减. 总之,函数在堆栈中的分布情况是,地址从高到低,依次是:函数参数列表,函数返回地址,函数执行代码段.堆栈中,各个函数的分布情况是倒叙的.即最后一个参数在列表中地址最高部分,第一个参数在列表地址的最低部分.参数在堆栈中的 分布情况如

c语言可变参数函数

c语言支持可变参数函数.这里的可变指,函数的参数个数可变. 其原理是,一般情况下,函数参数传递时,其压栈顺序是从右向左,栈在虚拟内存中的增长方向是从上往下.所以,对于一个函数调用 func(int a, int b, int c); 如果知道了参数a的地址,那么,可以推导出b,c的地址 #include <stdio.h> void test(int a, int b, int c) { printf("%p, %p, %p\n", &a, &b, &