C函數參數特性

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

 

發佈了25 篇原創文章 · 獲贊 4 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章