通過引數列表向C語言傳遞引數
雖然很多時候寫C語言main函式的時候都選擇把形參寫為空,也就是void,但是這並不是唯一的寫法。C語言實際上支援向主函式傳遞兩個引數,此時的函式原型如下:
int main(int argc, char **argv);
其中,第一個引數用於代表引數的個數;第二個引數則是用於向程式傳遞引數的列表,通常是一組值。寫程式碼如下:
#include"stdio.h"
int main(int argc,char **argv)
{
while(*++argv != NULL)
{
printf("%s\n",*argv);
}
return 0;
}
通過上面的程式,可以實現輸出向主函式傳遞的引數列表。之所以在判斷的時候進行了指標的自加是為了避開第一個引數,引數列表的第一個引數其實是程式的名字。
程式編譯執行如下:
E:\WorkSpace\01_程式語言\01_C語言\exp_09>gcc exp_09.c -o a(其中“a”是編譯生成的檔案可執行程式。)
E:\WorkSpace\01_程式語言\01_C語言\exp_09>a hello c lang world
hello
c
lang
world
回過頭來再多看一點東西,看一下第一個引數的資訊。修改程式碼直接打印出整個引數列表,程式碼修改如下:
#include"stdio.h"
int main(int argc,char **argv)
{
while(*argv != NULL)
{
printf("%s\n",*argv);
argv++;
}
return 0;
}
編譯執行如下:
E:\WorkSpace\01_程式語言\01_C語言\exp_09>gcc exp_09.c
E:\WorkSpace\01_程式語言\01_C語言\exp_09>a hello c lang world
a
hello
c
lang
world
通過以上結果可以看出,本次程式的執行多輸出了一個資訊,也就是第一行的a。其實,由於採用了gcc預設的編譯方式,生成的可執行檔名稱就是a。通過程式的行為推測,這個引數的獲取應該是通過作業系統介面獲知了當前的檔名稱。接下來不做編譯,直接把a修改一下名字繼續以下測試:
E:\WorkSpace\01_程式語言\01_C語言\exp_09>copy a.exe test.exe
已複製 1 個檔案。
E:\WorkSpace\01_程式語言\01_C語言\exp_09>test hello c lang world
test
hello
c
lang
world
通過執行結果可以看出,其實程式名稱的獲取資訊並不是來源於編譯階段而是來自於執行階段。