先看看由VC6自动生成的Hello World程序代码:
1 // hello world.cpp : Defines the entry point for the console application.
2 //
3
4 #include "stdafx.h"
5
6 int main(int argc, char* argv[])
7 {
8 printf("Hello World!\n");
9 return 0;
10 }
刚学C语言的时候,书上的Hello World程序的main函数也是带参的,当时老师告诉我们:这个你们先别管,以后会懂的。然后就轻轻带过了,到后来写出程序的时候,main函数总是作为主调函数,貌似也没有带参的必要,也就慢慢忘了这回事,几乎都不记得main其实是有参数的,前两天看《C Primer Plus》文件与I/O库那一章的时候,发现里面的举例程序都要判断main函数的参数。
上网查了一下
main函数参数的设置及作用函数的参数用来在函数调用时,往被调用函数传递数据,而main函数在C程序中,不被任何函数所调用,那main函数的参数从何处得到数据呢?每一个C程序的执行都是在系统的支持下进行的,main函数是系统执行相就的程序得到“调用”,从系统命令行中得到相应的参数。
main函数有两个参数,其中第一个参数的类型为整型,用于指出命令行中字符串的个数;第二个参数是一个字符指针数组,分别指向命令行中各个字符串,其一般形式为:main(intargc,char*argv[]);其中,变量的名字可以根据程序人员的爱好进行改变,但参数的数目及各参数的类型是不可改变的,如有一个程序文件为file_cpy.exe,如果执行时,命令行为:file_cpys_fd_f,则参数argc得到值3,而argv[0]、argv[1]、argv[2]分别指向字符串“file_cpy”、“s_f”、“d_f”。
我们函数名后面的括号是用来传递参数的;通常是一个函数向另外一个函数传入参数,而得到一个返回值或一系列的操作,用网友的话就是谁调用,谁传参;main()与其他函数的特殊性在于,没那个函数可以向它传入参数,因为它是入口点,那这个参数表有什么用呢?还是那句话,谁调用,谁传参,main函数其实是让用户来调用的,所以用户会给它传入参数,main()并不是说用户没有传入任何参数,而是指用户传入的参数就是只有程序的名字,这情况下,一般不需要进行特殊处理,可以当作什么也没有传入,即为main(void)用过MS-DOS或linux,unix的人知道在命名行下,很多的命名有许多的开关,通过在同一个程序名后输入不同的开关,就可以执行不同的命名了,这是如何实现的呢,其实就是通过检查用户传入的除程序名的之外的其它数据来选择该执行什么命名的,argc记录用户传入参数的总的个数,argv会存储所有的参数的索引,方便程序调用分析。所以通常可以在main()函数内书写对用户的命令行输入进行检查的代码,对argv中的开关进行一一分析,就可执行相应的功能,当然这此功能,你又可以将其分解成一个个的函数,然后让main调用了;通常命名行下的许多命令都有很多的参数选项,就是通过main()的参数列表来实现的。
其实只是一个很简单的问题,但是以前都没注意到,其实VC6在生成代码时上面有一行注释
Defines the entry point for the console application.
翻译过来是:定义控制台应用程序入口点。这貌似也说明了main函数是由控制台调用的吧,自然的参数也就和控制台有关。
其实归根到底原因还是平时思考太少,碰到一些问题都不去深入思考,思维惰性。
更新日志:
2013年1月4日20:46:04
最近看《linux程序设计》,恍然大悟,这参数的作用就是通过定义不同的参数,在控制台调用程序的时候输入不同的参数可以执行不同的功能。
比如 ls 命令:
ls ——默认格式显示当前目录文件
ls -l ——以长格式显示文件属性
ls -al ——以长格式显示所有文件,包括隐藏文件。
linux下一个命令就是一个程序,通过控制台向main函数传参,来执行不同代码块以实现不同的功能。