天天看點

C語言中的main函數參數及傳回值

我們經常看到main函數不帶參數。是以main後都是空括号。

main()
{
...
}      

實際上,main函數必須帶參數,這個參數可以認為是main函數的形式參數。C語言規定main函數的參數隻能有兩個,習慣上這兩個參數寫為argc和argv。是以,main函數的函數頭可寫為:

main (argc,argv)      

C語言還規定argc(第一個形參)必須是整型變量,argv( 第二個形參)必須是指向字元串的指針數組。加上形參說明後,main函數的函數應寫為:

main (argc,argv) 
int argv; char *argv[]; 
{
...
}      

 或寫成:

main (int argc,char *argv[])   
{
...
}
           

由于main函數不能被其它函數調用,是以不可能在程式内部取得實際值。那麼,在何處把實參值賦予main函數的形參呢? 實際上,main函數的參數值是從作業系統指令行上獲得的。當我們要運作一個可執行檔案時,在DOS提示符下鍵入檔案名,再輸入實際參數即可把這些實參傳送到main的形參中去。DOS提示符下指令行的一般形式為:

C:\>可執行檔案名 參數 參數……      

但是應該特别注意的是,main的兩個形參和指令行中的參數在位置上不是一一對應的。因為,main的形參隻有二個,而指令行中的參數個數原則上未加限制。

argc參數表示了指令行中參數的個數(注意:檔案名本身也算一個參數),argc的值是在輸入指令行時由系統按實際參數的個數自動賦予的。例如有指令行為:

C:\>program alpha beta gamma,由于檔案名program本身也算一個參數,是以共有4個參數,是以argc取得的值為4。argv參數是字元串指針數組,其各元素值為指令行中各字元串(參數均按字元串處理)的首位址。指針數組的長度即為參數個數。數組元素初值由系統自動賦予。

main(int argc,char *argv[]){
  while(argc-->1) printf("%s\n",*++argv); 
}       

本例是顯示指令行中輸入的參數。如果上例的可執行檔案名為program.exe,存放在A驅動器的盤内。是以輸入的指令行為:

C:\>a:program alpha beta gamma則運作結果為:

alpha 

beta 

gamma

該行共有4個參數,執行main時,argc的初值即為4。argv的4個元素分為4個字元串的首位址。執行while語句,每循環一次argv值減1,當argv等于1時停止循環,共循環三次,是以共可輸出三個參數。在printf函數中,由于列印項*++argv是先加1再列印,故第一次列印的是argv[1]所指的字元串alpha。第二、 三次循環分别列印後二個字元串。而參數program是檔案名,不必輸出

作業系統在調用main函數時是傳參數的,main函數的标準原型應該是:

int main(int argc, char *argv[])      

當然,我們也可以做一點小小的改動。例如:char *argv[] 可以寫成 char **argv;

int main(int argc, char **argv)      

main 函數的傳回值類型必須是int,這樣傳回值才能傳遞給程式的激活者(如作業系統)。

我們先看一下main()函數的帶參的形式:

main(argc,argv)
int argc,char *argv[];
{
.....
}      

其中,argc是指令行參數的個數;argv指向一個指針數組的首元素,數組中每個元素都是char *指針,指向整個指令行參數字元串。

C标準也允許int main(void) 這種寫法,如果不使用系統傳進來的兩個參數也可以寫成這種形式。

除了以上兩種形式之外,定義main函數的其它寫法都是錯誤的或不可移植的。