函数的可变参数详谈
可变参数的英文表示为:variable argument.9c&w LA&sW$d它在函数的定义时,用三个点号'.'表示,用逗号与其它参数分隔. Y6f5J+{s:V@n
可变参数的特点:不像固定参数那样一一对应,也不像固定参数有固定的参数类型和参数名称;可变参数中个数不
定可是传入的是一个参数也可以是多个;可变参数中的每个参数的类型可以不同,也可以相同;可变参数的每个参数并没有
实际的名称与之相对应.(oZ9k v*l1t_/b.Ys
由此可见,可变参数的形式非常自由而富有弹生.因些,它给那些天才程序员有更大地想象和发挥空间.
然而,更多地自由,同样也加大操作上的难度.|+I i2I{$M
以下就对可变参数的几个方面作一定的介绍.)O {0o+T+nW%r,o
V xC%J-y)|^f6[9h${
1)可变参数的存储形式.*Kk*}C2C[
+D-^ Z7`rT vUeA
大家都知道,一般函数的形参属于局部变量.而局部变量就是存储在内存的栈区(所谓的栈区:由编译器自动分配释放,!rV"ZFE'c-Md&x
存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。).可变参数也是存储在内存栈区. z;M_-Z&A
在对函数的形参存储的时侯,编译器是从函数的形参的右边到左边逐一地压栈,~`U'i{
这样保证了栈顶是函数的形参的第一个参数(从左到右数).而80x86平台下的内存分配顺序是从高地址内存到低地址内存.(G v_8fK
因此,函数的形参在内存的存储形式如下图(以fun(int var1,int var2,...,int var3,int var4)为例):
栈区:
"ce8G8M8_kP$ON
|栈顶 低地址
|第一个固定参数var1
|可变参数前的第一个固定参数var2
|可变参数的第一个参数
|...a}+~-ZqZ
|可变参数的最后一个参数%^ HY[ ~C`b
|函数的倒数第二个固定参数var3f"eSv[FF
|函数的最后一个固定参数var4
|...