1. 程式人生 > >深度剖析c語言main函式---main函式的引數傳遞

深度剖析c語言main函式---main函式的引數傳遞

  在上文中,我們主要講了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[]);

變數名稱argc和argv是常規的名稱,當然也可以換成其他名稱。命令列執行的形式為:可執行檔名 引數1 引數2 … … 引數n。可執行檔名稱和引數、引數之間均使用空格隔開。

示例程式

#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