前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >怎么理解int main(int argc, const char *argv[])

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

作者头像
莫斯
发布2020-09-09 23:51:46
1.9K0
发布2020-09-09 23:51:46
举报
文章被收录于专栏:备份备份

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

代码语言:javascript
复制
// 代码 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)试一试:

代码语言:javascript
复制
// 代码 1-1
#include<stdio.h>

int main()
{
    int tag;
    printf("%d\n", tag); 
    return 0;
}
代码语言:javascript
复制
// 代码 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)

代码语言:javascript
复制
// 代码 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

下面验证一下小结的两个观点:

代码语言:javascript
复制
// 代码 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]);
    }
}
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
代码语言:javascript
复制
// 代码 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;
}
这里写图片描述
这里写图片描述
代码语言:javascript
复制
// 代码 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默认值

代码语言:javascript
复制
// 代码 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”的一些问题,有兴趣的朋友可以看看

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-10-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档