标题:C函数参数特性
作者:白开水
编写日期:2012.5.22
前言
C语言,是函数构成的语言,C离不开函数,函数对于C的存在有着决定性的作用。那么,函数参数对于C的重要性也就可想而知了。
下面我就谈谈C函数参数的一些性质。
参数特性简介
特点一:函数参数的传递顺序。
实例一
void func( int id1 , int id2 )
{
printf ( “func()->id1=%d,id2=%d” , id1 , id2 );
}
void main ( )
{
int id1 = 10 ;
func ( ++id1 , ++id2 );
}
请问这输出什么?
运行结果:func()->id1=12,id2=11
怎么会这样呢?怎么可能这样呢?按照我们的思维方向——从左到右,应该是func()->id1=11,id2=12呀!怎么会是反的呢?真奇怪!
冥思苦想吧,终于可又得出一个结论:函数参数的传递顺序是从右向左传递的。
特性二:函数参数的首、末地址。
实例二
int func1 ( int id1 , int id2 )
{
return printf ( “func1 ()->&id1=0x%x,&id2=0x%x\n” , &id1 , &id2 );
}
int func2( int id1 , int id2 , int id3 , int id4 )
{
return printf ( “func2 ()->&id1=0x%x,&id2=0x%x,&id3==0x%x,&id4=0x%x\n” , &id1 , &id2, &id3 , &id4 );
}
调用这两个函数,请问它们分别输出什么?
在这里,输出的是参数的地址,输出结果为:
func1 ()->&id1=0x12ff2c,&id2=0x12ff30
func2 ()->&id1=0x0x12ff24,&id2=0x12ff28,&id3==0x12ff2c,&id4=0x12ff30
这样的结果意味着什么呢?最后一个参数的地址都是一样,从后起往左走,一样的步长(4个字节)地减小。
这也就是说函数参数的首地址是随着参数个数进行变化的,末地址是不变的,也就是末地址是确定的。
注:参数的末地址可能根据各种原因进行变化的,并非都为 0x12ff30。
特点三:可变参数。
实例三
int func ( const char *format , … )
{
va_list vl;
int result = 0;
va_start ( vl , format );
result = vprintf ( format , vl );
va_end ( vl );
return result;
}
请问这样的参数对吗?如果对,有什么理由这样写?
这样的参数写法是正确的,称作可变参数。有了特点二的帮助,那么这个问题就能很好地回答了。
如实例3所示的代码,即函数参数在被调用的时候,参数首地址可以确定,参数个的步长可以确定,参数的个数可以确定,也即参数末地址可以确定了。
为什么参数不写成 …,const char *format呢?我想在以上的解释中,你应该明了啦。