14-3. 主函数参数

  • 学习人数 30K+
  • 适合所有人群学习
avatar
林耿亮

你好编程主讲老师

想必大家已经自己定义过很多函数了。根据函数需要实现的功能,这个函数可能带参数,也有可能不带参数。而主函数main,大家可能对不带参数的形式main()比较熟悉。事实上,主函数main也可以带参数。

本节当中,我们将讨论主函数main是否需要参数,它的参数可以是什么,怎样使用它的参数。在讨论主函数参数前,我们先讨论为何需要主函数参数,它的参数是由谁来传递的。

1. ping命令

我们尝试在命令提示符中,使用ping.exe这个可执行文件。

首先,打开命令提示符。按下Win + R键,在弹出的运行窗体中,输入cmd

运行窗体

接着,会打开一个黑底白字的窗口,这个窗口就是命令提示符。

命令提示符

现在,我们需要执行ping.exe这个可执行文件。由于ping.exe这个可执行文件在系统的搜索目录当中。所以,我们直接输入ping.exe并回车,或者省略后缀名直接输入ping并回车。命令提示符会在系统搜索目录中找到该可执行文件并执行。

执行ping,会列出ping它的用法和各种参数。

ping命令

ping这个可执行文件,用于向目标主机发送一个网络请求,目标主机若收到该请求将返回一个回应。通常,用于测试目标主机和网络是否正常。

让我们测试一下本机和114.114.114.114的连接是否正常。

ping 114.114.114.114

执行这段命令后,我们可以看到对目标主机114.114.114.114发送了4次请求,并且目标主机了回复了这4次请求。每一次从请求直到收到回复耗时37毫秒。这些信息说明,我们的电脑与目标主机114.114.114.114之间的连接是通畅的。

ping114

让我们再测试一下本机和baidu.com的连接是否正常。

ping baidu.com

ping baidu

执行这段命令后,我们可以看到对目标主机baidu.com发送了4次请求,并且目标主机了回复这4次请求。每一次从请求直到收到回复耗时40到50毫秒。这些信息说明,我们的电脑与目标主机baidu.com之间的连接也是通畅的。

windows下,ping发送4次请求后,就会终止了。可以附加上参数-tping不停地发送请求,直到按下Ctrl + C键停止。

ping baidu.com -t

下图中,使用-t参数,ping发送了8次请求后,按下Ctrl + C键停止程序。

-t

接下来,测试一下无法收到回复的情况,尝试对10.0.0.0发送请求。

ping 10.0.0.0

ping 10.0.0.0

执行这段命令后,我们可以看到对目标主机10.0.0.0发送了4次请求,但是每一次目标主机都没有回复,直到等待时间超时。这些信息说明,我们的电脑与目标主机10.0.0.0之间无法连接。

之前我们尝试了使用ping命令向不同的目标主机发送请求。接下来,我们来讨论一个问题:不同的目标主机名和选项是如何传递到程序当中的呢?

如果按照之前所学过的知识,可以调用scanf等函数获取输入。但是,如果调用scanf等输入函数,需要先运行可执行程序。待程序执行到输入函数时,才会读取输入。而在我们使用ping命令时,把需要输入的字符串附带在可执行程序名ping其后。例如:

ping baidu.com -t

输入命令并按下回车后,命令提示符才会执行程序ping.exe。很显然,此时程序还未运行。因此,这种机制不同于调用scanf等输入函数。事实上,待程序执行后,这些命令字符串会被传递到主函数参数中。程序可以通过主函数参数,获取这些命令字符串。

2. 主函数参数

带参数的主函数定义如下所示:

int main(int argc, char **argv)
{

    return 0;
}

主函数的参数类型与数量是固定的,它可以带两个参数,分别是intchar **类型。参数名和其他函数一样可以自定义,但是惯例上使用argcargv作为两个参数的参数名。

第一个参数名argcargument count参数数量的缩写。 第二个参数名为argvargument value 参数值的缩写。

例如,我们使用如下命令启动ping这个可执行文件时。

ping baidu.com -t

若主函数带有参数,那么第一个参数是值为3,即命令拥有3个由空格分隔的字符串。

第二个参数是一个char **类型的指针,它指向元素类型为char *数组的首元素。数组中元素分别指向各字符串的首字符。

这3个字符串分别为:

  1. ping
  2. baidu.com
  3. -t

从二级指针argv获取到字符串首元素指针有两种办法,它们是等价的:

  1. 使用指针移动和取值运算符。
  2. 使用下标。

使用取值运算符的写法:

使用取值运算符的写法

*argv指向第一个字符串的首字母 *(argv + 1)指向第二个字符串的首字母 *(argv + 2)指向第三个字符串的首字母

使用下标的写法:

使用下标的写法

argv[0]指向第一个字符串的首字母 argv[1]指向第二个字符串的首字母 argv[2]指向第三个字符串的首字母