深入理解及如何使用main函数参数

news/2024/9/29 3:20:06/

目录

  • 前言:
  • 一、main函数参数
  • 二、main函数参数的意义及如何使用
  • 三、从操作系统层面(指令)理解main函数参数

前言:

在平时编写代码的过程中,我们会经常写main函数,这是一个程序必不可少的,main 函数是一个特殊的函数,它是程序执行的入口点,但我们往往都没有在意或使用main函数的参数,但main函数其实是有自己自带的参数类型的,只是我们一般没有用到

一、main函数参数

main函数中有两个参数(准确来说是三个,不过我们一般不使用(envp环境指针))

int main(int argc,char* argv[]
{//函数体return 0;
}

argc:

argc(argument count)是一个整数,表示传递给程序的命令行参数的数量

argv:

argv(argument vector)是一个字符指针数组,其中包含了所有命令行参数的字符串

在这里插入图片描述

不过要注意的是一般argv[0]通常是程序的名称,这个字符指针数组从下标1开始使用

二、main函数参数的意义及如何使用

平常我们练习代码时,代码程序写好就可以直接编译运行了,但其实我们是可以通过命令行参数给我们写好的程序传递我们需要传递的参数的

这样即使我们写好了我们的代码,我们也可以在程序的外部对我们的程序进行控制

比如我们写了一个模拟计算器代码,我们可以在这个代码运行前传参进行控制

#include<stdio.h>
#include<stdlib.h>
#include<string.h>int main(int argc,char* argv [])
{int s=0;int num1=atoi(argv[2]);int num2=atoi(argv[3]);if(strcmp(argv[4], "+") == 0){s=num1+num2;printf("%d\n",s);}if(strcmp(argv[4], "-") == 0){s=num1-num2;printf("%d\n",s);}if(strcmp(argv[4], "*") == 0){s=num1*num2;printf("%d\n",s);}if(strcmp(argv[4], "/") == 0){s=num1/num2;printf("%d\n",s);}printf("argv[0] = %s\n",argv[0]);printf("argv[1] = %s\n",argv[1]);printf("argv[2] = %s\n",argv[2]);printf("argv[3] = %s\n",argv[3]);printf("argv[4] = %s\n",argv[4]);printf("计算结束");return 0;
}

在命令行传入不同的参数即可控制该程序的执行流程

如:
在这里插入图片描述

  • 因此有了main函数参数,通过命令行参数,用户可以在程序运行时提供特定的输入或选项,从而控制程序的执行流程或行为。
  • 对于需要处理大量数据或执行重复任务的程序,通过命令行参数可以方便地实现批处理。
  • 允许程序适应不同的运行环境或执行不同的任务,而无需修改程序代码。

总之,main 函数的参数提供了一种灵活的方式来控制程序的执行,使程序能够更广泛地适应不同的使用场景和需求。

三、从操作系统层面(指令)理解main函数参数

在我们学习操作系统的一开始,我们会学习许许多多的指令,比如Linux中的ls、Windows中的cmd等等

如果你理解的比较深刻你会知道这些指令在根本上就是一个程序

以Linux中的ls举例,我们知道ls的基本用途是列出目录,但它还有许多的命令选项,比如ls -a/-l/-h,到这里你有没有发现这是不是和我们的main函数参数很像,所以操作系统中的指令及选项也是main函数参数的一种运用,在命令行传递不同的参数在控制不同的选项,从而达到不同的作用


http://www.ppmy.cn/news/1530653.html

相关文章

【WPF】多屏幕展示

使用环境为.Net Framework&#xff0c;如果有.Net 6的解决方案&#xff0c;欢迎交流。 话不多说&#xff0c;先上代码&#xff01; /// <summary>/// Window窗口展示设置/// </summary>/// <param name"monitor"></param>/// <param nam…

每天学习一个技术栈 ——【Celery】篇(2)

前篇&#xff1a;每天学习一个技术栈 ——【Celery】篇&#xff08;1&#xff09;-CSDN博客 四、常见场景 Celery的灵活性和强大功能使其在各种应用场景中得到广泛应用。以下是一些常见的使用场景&#xff0c;帮助你理解如何在实际项目中利用Celery。 1. 背景任务处理 在Web应…

开发经验总结: 读写分离简单实现

背景 使用mysql的代理中间件&#xff0c;某些接口如果主从同步延迟大&#xff0c;容易出现逻辑问题。所以程序中没有直接使用这个中间件。 依赖程序逻辑&#xff0c;如果有一些接口可以走读库&#xff0c;需要一个可以显示指定读库的方式来连接读库&#xff0c;降低主库的压力…

【C++】继承(下)

个人主页~ 继承&#xff08;上&#xff09;~ 继承 四、派生类的默认成员函数五、继承与友元六、继承与静态成员七、复杂的菱形继承以及菱形虚拟继承1、菱形继承2、菱形虚拟继承 八、继承的总结与反思继承和组合 四、派生类的默认成员函数 派生类的构造函数必须调用基类的构造…

SpringBoot开发——整合P6Spy详细记录SQL执行耗时情况

文章目录 1、p6spy是什么2、SpringBoot整合P6Spy2.1 引入依赖2.2 数据库操作2.3 测试代码2.4 p6spy配置2.5 其它自定义监控并优化数据库操作的性能至关重要。为了提升应用性能和数据库效率,很多项目会实现一个功能来打印SQL执行耗时。这一功能通过在SQL查询执行前后记录时间戳…

SourceTree保姆级教程1:(克隆,提交,推送)

本人认为sourceTree 是最好用的版本管理工具&#xff0c;下面将讲解下sourceTree 客户端工具 克隆&#xff0c;提交&#xff0c;推送 具体使用过程&#xff0c;废话不多说直接上图。 使用步骤&#xff1a; 首先必须要先安装Git和sourceTree&#xff0c;如何按照参考其它文章&…

MT76X8、MT7621、MT7981和QCA9531的GPIO列表

一、 MT76X8 GPIO列表; 二、 MT7621 GPIO列表; 三、MTK7981 GPIO列表; 四、QCA9531 GPIO列表;

2024.09.22 leetcode 每日一题

Excel表列名称 给你一个整数 columnNumber &#xff0c;返回它在 Excel 表中相对应的列名称。 https://leetcode.cn/problems/excel-sheet-column-title/description/ 我的解法&#xff1a; class Solution { public:string convertToTitle(int columnNumber) {std::map<…