Linux中main和初启函数,main 中的 argv和argc 到底是个啥意思?

原标题:main 中的 argv和argc 到底是个啥意思?

前言

一般我们平时写main函数的话,一般都是写不带参数的比较多,而且也习惯了这样写;其实标准的形式写法,main函数是带两个参数的,这两个参数分别是:argc和argv,那么这两个参数是表示什么意思,怎么用呢?今天就给大家分享main函数里面这两个参数的使用,下面看到这样的写法,要明白这样写的意思哦!

main函数返回给谁

01

函数为什么需要返回值

函数在设计的时候设计了参数和返回值,参数是函数的输入,返回值是函数的输出。

因为函数需要对外输出数据(实际上是函数运行的一些结果值),因此需要返回值。

形式上来说,函数被另外一个函数所调用,返回值作为函数式的值返回给调用这个函数的地方。

总的来说,函数的返回值就是给调用的地方返回一个值。

02

main函数被谁调用

(1)main函数是特殊的,首先这个名字是特殊的;因为在c语言里面规定了main函数是整个程序的入口;其它函数只有直接或者间接被main函数所调用才能被执行,如果没用被main函数直接或者间接调用,则这个函数在整个程序中无用。

(2)main函数从某种角度来讲,它代表了当前这个程序,或者说是整个程序;main函数的开始意味着整个程序开始执行,main函数的结束返回意味着整个程序的结束。

(3)谁执行了这个程序,谁就调用了main函数。

03

Linux下一个程序执行的本质

(1)表面来看,Linux中在命令行中去./xx去执行一个可执行程序。

(2)我们可以通过shell脚本来调用执行一个程序(下面会写一个shell脚本)。

(3)我们还可以在程序总去调用执行一个程序(fork exec),这个在Linux应用编程里面的文章里面有写过这个,可以参考这篇文章—— Linux系统下进程编程之exec族函数解析(四)

(4)我们有多种方法来执行一个程序,但是本质上都是相同的。Linux中一个新程序的执行本质上是一个进程的创建、加载、运行、消亡。Linux中执行一个程序其实就是创建一个新进程,然后把这个程序丢进这个进程中去执行,直到结束。新进程是被谁开启?在Linux中进程都是被它的的父进程fork出来的。

(5)命令行本身就是一个进程(就是我们平时在Linux下打开一个终端),在命令行下去./xx执行一个程序,其实这个新程序是作为命令行进程的一个子进程去执行的。总之一句来说,一个程序被它的父进程所调用。

(6)小结:main 函数返回给调用这个函数的父进程;父进程要这个这个返回值干嘛?父进程调用子进程来执行一个任务,然后子进程执行完后,通过main函数的返回值返回给父进程一个答复,这个答复一般是表示子进程的任务执行结果完成了还是错误的(0表示执行成功,负数时表示执行失败)。

04

实践验证获取main的返回值

(1)用shell脚本执行程序可以获取程序的返回值并且打印出来:

# include

intmain( void)

{

return0;

}

然后我再创建一个shell脚本:

ab9580456c29ac1e7a1b8b3c4cc80713.png

shell脚本里面的内容为:

#!/bin/sh

./a.out

echo$?

执行结果为:

说明:Linux shell中用$?这个符号来存储和表示上一个程序执行结果(这里就是./a.out)。#!/bin/sh这个书写shell脚本的格式。

argc、argv

01

main的书写形式

一般正规main函数的书写形式有三种:

intmain( void)

intmain( intargc, char**argv)

intmain( intargc, char*argv[])

02

谁给main函数传参

(1)调用main函数所在的程序的它的父进程给main函数传参,并且接收main的返回值。

03

为什么要给main函数传参

(1)首先,main函数不传参是可以的,也就是说父进程调用子进程并且给子进程传参不是必须的;int main(void)这种形式就是不要传参了。

(2)有时候我们希望程序有一种灵活性,所以选择在执行程序时通过传参来控制程序中的运行,达到不需要重新编译程序就可以改变程序运行结果的效果。下面我先一个简单的程序为例来引出这个程序的灵活性:

e990c35daa583d6a4fb4bd068add1b12.png

我们可以看到如果要改程序里面的内容的话,必须得修改源代码才行,这样灵活不是很好。下面就是我们要讲的,给main函数传参,来提高程序的灵活性。

04

给main怎样来传参

(1)给main传参通过argc和argv这两个c语言预订的参数一起实现。

(2)argc是int类型的,表示运行程序的时候给main函数传递了几个参数;而argv是一个字符串数组,这个数组用来存储多个字符串,每个字符串就是我们给main函数传的一个参数,argv[0]就是我们给main函数的第一个传参,argv[1]就是传给main的第二个参数,以此类推后面的传参。

e7c436b602714e6d545e66a9dcb19fbe.png

运行结果:

dfaec4dfea98096fa3e7a12921828f1b.png

然后我在执行程序的时候,可以加参数:

3172839cb3c9d217a3534fee72a4c363.png

注意: (1)main函数传参都是通过字符串传进去。 (2)程序被调用时传参,各个参数之间是通过空格来间隔。 (3)程序内部如果要用argv,最好先检查一下argc。

-1大于1,-1乘3不等于-3?C语言的这个规则你必须得会!

3月编程语言排行榜 来了!!!

一文让你学完C++,干货收藏!!!

编程中著名的 “Hello World” 到底从何而来?

来个鹅厂C语言面试题试试手?

用C语言验证 “6174黑洞之谜” 返回搜狐,查看更多

责任编辑:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值