深度剖析c語言main函式---main函式的引數傳遞
阿新 • • 發佈:2018-12-25
在上文中,我們主要講了c語言main函式的返回值問題,本文主要將main函式的引數傳遞。
main函式傳參
首先說明的是,可能有些人認為main函式是不可傳入引數的,但是實際上這是錯誤的。main函式可以從命令列獲取引數,從而提高程式碼的複用性。
函式原形
為main函式傳參時,可選的main函式原形為:
int main(int argc , char* argv[],char* envp[]);
引數說明:
①、第一個引數argc表示的是傳入引數的個數
②、第二個引數char* argv[],是字串陣列,用來存放指向的字串引數的指標陣列,每一個元素指向一個引數。各成員含義如下:
argv[0]:指向程式執行的全路徑名
argv[1]:指向執行程式名後的第一個字串 ,表示真正傳入的第一個引數
argv[2]:指向執行程式名後的第二個字串 ,表示傳入的第二個引數
……
argv[n]:指向執行程式名後的第n個字串 ,表示傳入的第n個引數
規定:argv[argc]為NULL ,表示引數的結尾。
③、第三個引數char* envp[],也是一個字串陣列,主要是儲存這使用者環境中的變數字串,以NULL結束。envp[]的每一個元素都包含ENVVAR=value形式的字串,其中ENVVAR為環境變數,value為其對應的值。envp一旦傳入,它就只是單純的字串陣列而已,不會隨著程式動態設定發生改變。可以使用putenv函式實時修改環境變數,也能使用getenv實時檢視環境變數,但是envp本身不會發生改變;平時使用到的比較少。
注意:main函式的引數char* argv[]和char* envp[]表示的是字串陣列,書寫形式不止char* argv[]這一種,相應的argv[][]和
char** argv均可。
char* envp[]
寫個小測試程式,測試main函式的第三個引數:
#include <stdio.h>
int main(int argc ,char* argv[] ,char* envp[])
{
int i = 0;
while(envp[i++])
{
printf("%s\n", envp[i]);
}
return 0;
}
執行結果:部分截圖
envp[] 獲得的資訊等同於Linux下env命令的結果;
常用版本
在使用main函式的帶參版本的時,最常用的就是:int main(int argc , char* argv[]);
示例程式
#include <stdio.h>
int main(int argc, char* argv[])
{
int i;
printf("Total %d arguments\n",argc);
for(i = 0; i < argc; i++)
{
printf("\nArgument argv[%d] = %s \n",i, argv[i]);
}
return 0;
}
執行結果:
➜ cpp_workspace git:(master) ✗ vim testmain.c
➜ cpp_workspace git:(master) ✗ gcc testmain.c
➜ cpp_workspace git:(master) ✗ ./a.out 1 2 3 #./a.out為程式名 1為第一個引數 , 2 為第二個引數, 3 為第三個引數
Total 4 arguments
Argument argv[0] = ./a.out
Argument argv[1] = 1
Argument argv[2] = 2
Argument argv[3] = 3
Argument argv[4] = (null) #預設argv[argc]為null