【浅谈】main函数的参数

我们平时使用main函数时,在main函数参数这一栏常常省略不写,或者填上(void)。实际上main函数是具有参数的,并且它的参数有很大作用。今天我们来看看main函数的参数。

main函数的参数有哪些?

 int main (){return 0;}

在我们写好一个main函数框架后按F10开始单步调试,一直调试到走出main函数大括号外。这时我们能够看到如下代码:
  
  我们可以很清晰的看到main函数时有参数的,而且是三个参数,并且在main函数被调用时是有这三个参数被传入的,但是我们日常并没有使用过。
  下面我将三个参数的定义写出:

 int main (int argc, char *argv[], char *envp[]){return 0;}

要搞懂这几个参数的实际意义,我们需要在VS编译器下,右击工程名,选择属性选项,在配置属性栏下选择子选项:<调试> , 在右边栏命令参数一栏添加一些字符,并以空格将它们一一隔开。
  (例如添加 :呵呵 哈哈 嘻嘻 嘿嘿)

  我们回到main函数代码块,写下如下代码并调试运行看看结果:

 int main(int argc, char *argv[], char *envp[]){int i = 0;for (i = 0; i < argc; i++){printf("%s\n", argv[i]);}return 0;}


  在控制台输出结果中可以看到,第一行显示的是我们编译的C文件的路径,而下面则是我们刚才在命令参数那栏写下的一些以空格隔开的字符。
  如果大家有接触过linux命令行的话,应该有见到过或者使用过如下的代码:

 ls -l       <linux> //这是列出当前目录下所有文件的详细参数

这里的 ls 以及 -l 就是我们所说的命令行参数。
  我们刚才在给调试右边栏命令参数栏中填写的以空格隔开的字符就是在给参数命名,后面我们会讲它的具体用法。
  那么由此我们可以分析出,我们在刚才main函数那个for循环中控制终止条件的argc就是我们的命令参数的个数。
  而在printf("%s\n", argv[i])中argv[]这个数组,通过main函数的定义我们知道它是一个存放char* 类型的指针数组。那么这里它应该就是存放的我们刚才输入的四个字符串的首地址。
  

事实上argv[]中最后一个元素恒存放一个空指针,作为argv数组的结束标志

  我们在windows命令行指令中(cmd)也能添加类似的命令行参数。按下电脑的win + R键调出运行窗口,在输入栏输入cmd然后回车,出现黑色窗口,这就是我们的终端窗口:
  
  紧接着在黑框中输入存放调试文件目录的那个磁盘的卷名。
  再使用cd命令将当前的路径转到存放我们当前调试的文件的DEBUG文件目录下,再使用dir命令列出当前目录下的文件(与Linux中ls命令相似):
  
  我们再输入**.exe**后缀的文件名后面加上一些字符,按回车运行之(即在cmd下执行刚才的调试程序,最终效果与刚才的程序效果相同):
  
  小伙伴们有没有发现,这和在编译器下运行的情况很相似,唯一的不同是我们在cmd窗口手动添加了几个字符。
  那么我们不妨展开联想,是否可以将这个特性运用到实际中去…

main函数参数有什么作用呢?

大家见识了main函数的前两个参数后,一定会有一个疑问,那就是命令行的参数到底怎么用?其实,在我们日常生活中常出现的计算器,就可以用main函数参数来简单实现。那么下面我就用main函数前两个参数来实现一下计算器这个小程序:
  假设我们想进行加法运算,那么肯定需要让电脑知道我们要进行加法运算,所以"add"这个命令参数必不可少,然后还有参与加法的两个操作数,只要有了这几个参数,我们就可以让电脑进行运算了。那么前提条件我们已经准备好了,下面我给大家来分步讲解一下实现方法。
  我们知道刚刚在main函数中写出的小程序的作用是输出argv[]数组中的各个元素,那么我们就可以得知,argc是记录我们刚才输出参数的个数的(因为argc在控制for循环的循环次数)。我们输入的那些参数全部被存放在argv[]这个数组当中,如果我们在输入参数后在读取argv[]数组是否可以做一个简单的计算器呢?
  这里我简单实现一个加法的小运算指令:

enum calc
{ADD = 'a',SUB = 's',MUL = 'm',DIV = 'd'
};int Add(int a, int b)
{return a + b;
}int Sub(int a, int b)
{return a + b;
}int Div(int a, int b)
{return a / b;
}int Mul(int a, int b)
{return a * b;
}int main(int argc, char *argv[], char *envp[])
{if(argc != 4) {prinf("usage : .exe sum1 [a | s | m | d] sum2\n");return -1;}int a = atoi(argv[1]);int b = atoi(argv[3]);int ret = 0;//switch (*(argv[1] + 1))switch( argv[2] ){case ADD: ret = Add(a, b);break;case SUB: ret = Sub(a, b);break;case MUL: ret = Mul(a, b);break;case DIV: ret = Div(a, b);break;default: printf("参数有问题\n");return -1;}printf("%d\n", ret);return 0;
}

这里我的思路是先判断argc的大小也就是用户输入参数个数是否是规定的大小。
  再将用户输入的第2,3个参数进行字符到数字的转换。
  最后我们使用switch判断语句判断用户想要进行的操作指令,这里我的事件标签使用枚举的方法是代码更具可读性。枚举类型的定义在最上面。

看到这,我们是不是对main函数的参数有了一定的了解。
##envp[]环境参数
  最后我们简单介绍一下第三个参数,envp[],这个数组与刚才的**argv[]**有些相似,它的最后一个元素也储存的空指针。接下来大家将envp[]数组中的元素打印出来:

int main(int argc, char *argv[], char *envp[])
{int i = 0;while (envp[i] != NULL){printf("%s\n", envp[i]);i++;}return 0;
}


  我们可以看到,这些字符串很复杂,不过这些是我们的环境变量,那么环境变量的作用我简单描述一下,其实就是搭建我们一个程序的工作环境,让它可以在我们想要的环境下进行工作。而不必去在程序中繁琐的设置,至于详细的作用,这里我就不多做介绍了。大家在以后的学习中肯定能够更深入的了解它的作用。

全文完,感谢浏览

【浅谈】main函数的三个参数相关推荐

  1. 关于main函数的三个参数

    每一C 程序都必须有一main()函数, 可以根据自己的爱好把它放在程序的某 个地方.有些程序员把它放在最前面, 而另一些程序员把它放在最后面, 无论放 在哪个地方, 以下几点说明都是适合的. 1. ...

  2. 浅谈linux的命令行解析参数之getopt_long函数

    前言 在linux中,经常需要各种命令,通常情况下都会带各种参数,而这些参数是如何解析的呢?通常使用GNU C提供的函数getopt.getopt_long.getopt_long_only函数来解析 ...

  3. oracle hash join outer,CSS_浅谈Oracle中的三种Join方法,基本概念 Nested loop join: Outer - phpStudy...

    浅谈Oracle中的三种Join方法 基本概念 Nested loop join: Outer table中的每一行与inner table中的相应记录join,类似一个嵌套的循环. Sort mer ...

  4. 三菱d700变频器模拟量控制_浅谈三菱FR—D700变频器基本参数的设定

    龙源期刊网 http://www.qikan.com.cn 浅谈三菱 FR - D700 变频器基本参数的设定 作者:韩雪 来源:<卷宗> 2017 年第 17 期 摘 要:本文介绍了变频 ...

  5. http://www.dewen.net.cn/q/16222/C++排序中的sort函数第三个参数的疑问

    C++排序中的sort函数第三个参数的疑问 唐图 3 票 37 #include<stdio.h> #include<string.h> #include<algorit ...

  6. 浅谈async函数await用法

    async和await相信大家应该不陌生,让异步处理变得更友好. 其实这玩意儿就是个Generator的语法糖,想深入学习得去看看Generator,不然你可能只停留在会用的阶段. 用法很简单,看代码 ...

  7. main函数第3个参数envp装的是什么(envp:环境变量)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/btwsmile/article/det ...

  8. range函数python三个参数_range()函数三种参数的用法

    第8篇分享 range()是python的内置函数,用的地方挺多的,目前我经常会在for循环中作为循环的次数来使用,其实range()的用法不仅仅如此,本文给大家介绍下range()函数的三种参数的基 ...

  9. 浅谈云函数的代理IP利用面

    浅谈云函数的代理IP利用面 前言 本篇文章介绍如何通过 Serverless(云函数) 实现各种扫描器探测功能,以达到绕过态势感知.WAF等安全设备,增大蓝队研判人员溯源难度,实现封无可封,查无可查的 ...

最新文章

  1. FreeTextBox1.6版本控件使用总结(未完)
  2. excel oledb mysql_OLEDB操作Excel
  3. 上世纪八九十年代的收录放音机拆解
  4. (46)System Verilog 类中变量随机激励权重分布
  5. apache的poi中设置Excel的单元格样式(HSSFCellStyle)和表格(HSSFSheet)
  6. python批量提取哔哩哔哩bilibili视频
  7. python--re模块
  8. c4d阿诺德渲染器支持a卡吗_请问C4D的OC渲染器支持的显卡是越好越快吗?
  9. 2023南京财经大学计算机考研信息汇总
  10. 基于ENVI进行遥感影像裁剪
  11. %3cp%3e 修改 值 html,UEditor在JavaWeb中的应用
  12. mysql ip访问限制解除
  13. Redis之时间轮机制(五)
  14. Linux(进程概念详解)
  15. 实战 | 如何使用微搭低代码实现按条件过滤数据
  16. 吴恩达机器学习课程笔记(英文授课) Lv.1 新手村(回归)
  17. 如何将图片背景变为透明色
  18. 泪目!视频剪辑教程自学百度云资源
  19. 谷歌L3到L7扎堆升职,股票refresh多过别人年薪!
  20. 国内邮箱免费邮箱注册哪个好?

热门文章

  1. 2022年数维杯国际大学生数学建模挑战赛C题如何利用大脑结构特征和认知行为特征诊断阿尔茨海默病解题过程
  2. 使用TinyProxy搭建代理服务器
  3. 【SpringBoot】SpringBoot @ConfigurationProperties 注解 用法与加载static静态属性
  4. python字母转换视频_python将视频转换为全字符视频
  5. 友盟社会化分享 QQ空间不显示分享的图片 (已解决)
  6. Archive for the 'TED' Category TED视频:Tan Le 能读懂脑电波的耳机
  7. BadUsb----结合实例谈此类外设的风险
  8. 跟我一起写makefile
  9. 点对点文件服务器,点对点文件同步工具(Syncthing)
  10. 笔记 | 百度飞浆AI达人创造营:深度学习模型训练和关键参数调优详解