怎么理解int main(int argc, const char *argv[])

时间:2022-07-24
本文章向大家介绍怎么理解int main(int argc, const char *argv[]),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

每次创建一个程序总会看到已经编写好的Hello World程序(如下代码 0-1):

// 代码 0-1
#include<stdio.h>

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<stdio.h>

int main()
{
    int tag;
    printf("%dn", tag); 
    return 0;
}
// 代码 1-2
#include<stdio.h>

int main(int argc, const char *argv[])
{
    int flag;
    printf("%dn",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<stdio.h>

int main(int argc, char *argv[])
{
    printf("%dn", argc); 
    while(argc){
        printf("%sn", 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 <stdio.h>

int main(int argc, char *argv[])
{
    printf("numOfargc = %dnn", argc);

    for(int j=0; j<argc; j++){
        printf("argv[%d] = %sn", j, argv[j]);
    }
}
// 代码 2-3-1
#include<stdio.h>

int main(int argc, char *argv[])
{
    int i;//定义变量i

    for(i=0; i<argc; i++){
        printf("argv[%d] = %sn", i, argv[i]);
    }

    return 0;
}
// 代码 2-3-2
#include<stdio.h>

int main(int argc, const char *argv[])
{
    printf("argc  =  %dn", argc);
    for(int i = 0; i<(sizeof(argv)/sizeof(*argv)); i++){//①
        printf("argv[%d] = %sn", i, argv[i]);
    }
    return 0;
}

① 修改可执行文件名进一步验证:

② 没有在终端输入变量情况下,打印argv默认值

// 代码 2-3-3
include<stdio.h>

int main(int argc, char *argv[])
{
    printf("numOfArgc = %dnn", argc);

    printf("numOfArgv = %lunn", sizeof(*argv));

    for(int i = 0; i<=sizeof(*argv); i++){ 
        printf("argv[%d] = %sn", i, argv[i]);
    }

    return 0;
}

③ 在终端输入变量

下面是看到的一道相关的题目:

【解析】

由上对于argc、argv[]详述可知:

  • argv[0] 指向路径E:ex.exe
  • argv[1] 指向字符串”abcd”
  • argv[2] 指向字符串”efg”
  • argv[3] 指向字符串”h3”
  • argv[4] 指向字符串”k44”

因此,for 循环计算的是argv[1]、argv[3]两个字符串的长度和4+2=6,即选D


Hello World知多少

上图是从《程序员的自我修养》一书关于“Hello World”的一些问题,有兴趣的朋友可以看看