每次创建一个程序总会看到已经编写好的Hello World
程序(如下代码 0-1):
// 代码 0-1
#include
int main(int argc, const char *argv[])
{
printf("Hello World!\n");
return 0;
}
为什么自己编写的时候没有”int argc, const char *argv[]”,运行结果也是一样的呢?这是不是意味着参数”int argc, const char *argv[]”没有任何作用呢?接下来逐步分析:
(1)是不是真的没有作用呢?怎样排除特殊性呢?于是,我尝试用下面两个程序(如下代码 1-1,1-2)试一试:
// 代码 1-1
#include
int main()
{
int tag;
printf("%d\n", tag);
return 0;
}
// 代码 1-2
#include
int main(int argc, const char *argv[])
{
int flag;
printf("%d\n",flag);
return 0;
}
实践是检验真理的唯一标准,运行看看,结果:1606422582、0,这两个数完全不符合猜想,因此:int main(int argc, const char *argv[])中的参数是有作用的
为什么运行结果不一样呢?参数argc和argv[]是什么,起了什么作用呢?
(1)探求:argc和argv[]
下面代码在Mac环境进行编译运行代码 2-1(parameter.c)
// 代码 2-1
#include
int main(int argc, char *argv[])
{
printf("%d\n", argc);
while(argc){
printf("%s\n", argv[--argc]);
}
return 0;
}
编译运行:
① 其中argc是指变量的个数,以例三为例:hello、a.out称为变量和./a.out程序运行的全路径名或程序的名字,argc即为3。
② argv是一个char *的数组,其中存放指向参数变量的指针,此处argv[0]指向./a.out的全路径名,argv[1]指向hello,argv[2]指向a.out
下面验证一下小结的两个观点:
// 代码 2-2-1
#include
int main(int argc, char *argv[])
{
printf("numOfargc = %d\n\n", argc);
for(int j=0; jprintf("argv[%d] = %s\n", j, argv[j]);
}
}
// 代码 2-3-1
#include
int main(int argc, char *argv[])
{
int i;//定义变量i
for(i=0; iprintf("argv[%d] = %s\n", i, argv[i]);
}
return 0;
}
// 代码 2-3-2
#include
int main(int argc, const char *argv[])
{
printf("argc = %d\n", argc);
for(int i = 0; i<(sizeof(argv)/sizeof(*argv)); i++){//①
printf("argv[%d] = %s\n", i, argv[i]);
}
return 0;
}
① 修改可执行文件名进一步验证:
② 没有在终端输入变量情况下,打印argv默认值
// 代码 2-3-3
include
int main(int argc, char *argv[])
{
printf("numOfArgc = %d\n\n", argc);
printf("numOfArgv = %lu\n\n", sizeof(*argv));
for(int i = 0; i<=sizeof(*argv); i++){
printf("argv[%d] = %s\n", i, argv[i]);
}
return 0;
}
【解析】
由上对于argc、argv[]详述可知:
因此,for 循环计算的是argv[1]、argv[3]两个字符串的长度和4+2=6,即选D
Hello World知多少
上图是从《程序员的自我修养》一书关于“Hello World”的一些问题,有兴趣的朋友可以看看