標題: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呢?我想在以上的解釋中,你應該明瞭啦。