想必大家已经自己定义过很多函数了。根据函数需要实现的功能,这个函数可能带参数,也有可能不带参数。而主函数main
,大家可能对不带参数的形式main()
比较熟悉。事实上,主函数main
也可以带参数。
本节当中,我们将讨论主函数main
是否需要参数,它的参数可以是什么,怎样使用它的参数。在讨论主函数参数前,我们先讨论为何需要主函数参数,它的参数是由谁来传递的。
1. ping命令
我们尝试在命令提示符中,使用ping.exe
这个可执行文件。
首先,打开命令提示符。按下Win + R
键,在弹出的运行窗体中,输入cmd
。
接着,会打开一个黑底白字的窗口,这个窗口就是命令提示符。
现在,我们需要执行ping.exe
这个可执行文件。由于ping.exe
这个可执行文件在系统的搜索目录当中。所以,我们直接输入ping.exe
并回车,或者省略后缀名直接输入ping
并回车。命令提示符会在系统搜索目录中找到该可执行文件并执行。
执行ping
,会列出ping
它的用法和各种参数。
ping
这个可执行文件,用于向目标主机发送一个网络请求,目标主机若收到该请求将返回一个回应。通常,用于测试目标主机和网络是否正常。
让我们测试一下本机和114.114.114.114
的连接是否正常。
ping 114.114.114.114
执行这段命令后,我们可以看到对目标主机114.114.114.114
发送了4次请求,并且目标主机了回复了这4次请求。每一次从请求直到收到回复耗时37毫秒。这些信息说明,我们的电脑与目标主机114.114.114.114
之间的连接是通畅的。
让我们再测试一下本机和baidu.com
的连接是否正常。
ping baidu.com
执行这段命令后,我们可以看到对目标主机baidu.com
发送了4次请求,并且目标主机了回复这4次请求。每一次从请求直到收到回复耗时40到50毫秒。这些信息说明,我们的电脑与目标主机baidu.com
之间的连接也是通畅的。
在windows
下,ping
发送4次请求后,就会终止了。可以附加上参数-t
让ping
不停地发送请求,直到按下Ctrl + C
键停止。
ping baidu.com -t
下图中,使用-t
参数,ping
发送了8次请求后,按下Ctrl + C
键停止程序。
接下来,测试一下无法收到回复的情况,尝试对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;
}
主函数的参数类型与数量是固定的,它可以带两个参数,分别是int
和char **
类型。参数名和其他函数一样可以自定义,但是惯例上使用argc
、argv
作为两个参数的参数名。
第一个参数名argc
为argument count
参数数量的缩写。
第二个参数名为argv
为argument value
参数值的缩写。
例如,我们使用如下命令启动ping
这个可执行文件时。
ping baidu.com -t
若主函数带有参数,那么第一个参数是值为3
,即命令拥有3个由空格分隔的字符串。
第二个参数是一个char **
类型的指针,它指向元素类型为char *
数组的首元素。数组中元素分别指向各字符串的首字符。
这3个字符串分别为:
- ping
- baidu.com
- -t
从二级指针argv
获取到字符串首元素指针有两种办法,它们是等价的:
- 使用指针移动和取值运算符。
- 使用下标。
使用取值运算符的写法:
*argv指向第一个字符串的首字母 *(argv + 1)指向第二个字符串的首字母 *(argv + 2)指向第三个字符串的首字母
使用下标的写法:
argv[0]指向第一个字符串的首字母 argv[1]指向第二个字符串的首字母 argv[2]指向第三个字符串的首字母