問題
將程序prog.c編譯鏈接後運行:prog -nla hello world則*(*(argv+2))
是( )
A.‘p’
B.’-’
C.‘h’
D.‘w’
分析
那麼就要思考argv是什麼?它是哪裏來的呢?
讓我們再回顧一下編寫C語言的代碼框架:
一般都是這樣的:
#include <stdio.h>
int main()
{
return 0;
}
可實際上上述代碼省略了main函數中的參數,實則爲:
#include <stdio.h>
int main(int argc, char** argv)
//或int main(int argc, char* argv[])
{
return 0;
}
那這裏的參數是什麼意思呢?
實際上,C語言的main函數擁有兩個參數,爲int類型的argc參數,以及char**類型argv參數。其中argc參數的值表示命令行參數的個數,而argv則指向一個字符串數組,該數組存儲了具體的命令行參數的內容。注意程序本身的名字爲命令行的第一個參數。
驗證
接下來,寫一段代碼來打印命令行參數信息:
#include <stdio.h>
int main(int argc, char** argv)
{
int i;
printf("%d\n",argc); //輸出argc的值,也就是命令行參數的個數(包括程序名)
for (i = 0; i < argc; ++i)
{
printf("argv[%d] = %s\n", i, argv[i]);//輸出每個數組的值
}
printf("*(*(argv+2)) = %c\n",*(*(argv+2)));//輸出開頭問題的答案
return 0;
}
總結
從結果可以很清楚的看出argc和argv代表的都是什麼。既然知道了每個變量表示的什麼,那麼結果自然而然的也就出來了。
最後再分析一下這個題目吧:
問題:*(*(argv+2))
分析:
argv+2 //地址加2,相當於argv[2]的地址
*(argv+2) //表示字符數組argv[2],同時表示字符串‘hello’的首地址
*(*(argv+2)) //首地址上的值,也就是‘h’
Over!