问题
将程序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!