怎么理解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("%d\n", tag); 
    return 0;
}
// 代码 1-2
#include<stdio.h>

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

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

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

    for(int j=0; j<argc; j++){
        printf("argv[%d] = %s\n", 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] = %s\n", i, argv[i]);
    }

    return 0;
}

这里写图片描述

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

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

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[]详述可知:

  • 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”的一些问题,有兴趣的朋友可以看看

  • 47
    点赞
  • 129
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值