标题：main函数
函数概述
日常生活中，要完成一件复杂的功能，我们总是习惯把“大功能”分解为多个“小功能”以实现。在C++程序  的世界里，“功能”可称呼为“函数”，因此“函数”其实就是一段实现了某种功能的代码，并且可以供其它代码调用。
一个程序，无论复杂或简单，总体上都是一个“函数”；这个函数就称为“main 函数”，也就是“主函数”。比如有个“做菜”程序，那么“做菜”这个过程就是“主函数”。在主函数中，根据情况，你可能还需要调用“买菜，切菜，炒菜”等子函数。
main函数在程序中大多数是必须存在的，但是依然有例外情况，比如windows编程中可以编写一个动态链接库（dll）模块，这是其他windows程序可以使用的代码。由于DLL模块不是独立的程序，因此不需要main函数。再比如，用于专业环境的程序-----如机器人中的控制芯片--可能不需要main函数。
参数
C程序最大的特点就是所有的程序都是用函数来装配的。main（）称之为主函数，是所有程
序运行的入口。其余函数分为有参或无参两种，均由main（）函数或其它一般函数调用，若调用
的是有参函数，则参数在调用时传递。
int main(void)
{
...
y1=f1(x1,x2);
...
}
f1(int a,int b)
{
....
Y2=f2(x3,x4);
....
}
f2(int m,int n)
{
....
.....
}
在前面课程的学习中，对main（）函数始终作为主调函数处理，也就是说，允许main（）调用
其它函数并传递参数。事实上，main（）函数既可以是无参函数，也可以是有参的函数。对于有
参的形式来说，就需要向其传递参数。但是其它任何函数均不能调用main（）函数。当然也同样
无法向main（）函数传递，只能由程序之外传递而来。这个具体的问题怎样解决呢？
我们先看一下main（）函数的带参的形式：
int main(int argc,char *argv[])
{
.....
}
从函数参数的形式上看，包含一个整型和一个指针数组。当一个C的源程序经过编译、链接后，会生成扩展名为.EXE的可执行文件（对windows操作系统而言），这是可以在操作系统下直接运行的文件，换句话说，就是由系统来启动运行的。对main（）函数既然不能由其它函数调用和传递参数，就只能由
系统在启动运行时传递参数了。
在操作系统环境下，一条完整的运行命令应包括两部分：命令与相应的参数。其格式为：
命令参数1参数2....参数n&iquest;
此格式也称为命令行。命令行中的命令就是可执行文件的文件名，其后所跟参数需用空格分隔，并为对命令的进一步补充，也即是传递给main（）函数的参数。
命令行与main（）函数的参数存在如下的关系：
设命令行为：program str1 str2 str3 str4 str5
其中program为文件名，也就是一个由program.c经编译、链接后生成的可执行文件program.exe，其后各跟5个参数。对main（）函数来说，它的参数argc记录了命令行中命令与参数的个数，共6个，指针数组的大小由参数argc的值决定，即为char*argv[6]，指针数组的取值情况如图6-15所示。
  
数组的各指针分别指向一个字符串。应当引起注意的是接收到的指针数组的各指针是从命令行的开始接收的，首先接收到的是命令，其后
才是参数。
下面用实例来说明带参数的main（）函数的正确使用。
[例6-29] 利用图形库函数绘制一个变化的环。它是把一个半径为R 1的圆周分成n份，然
后以每个等分点为圆心，以R s为半径画n个圆（关于作图的详细理论本教材第9章第1节作了专
门介绍，这里只作简单分析）。利用m a i n ( ）函数的带参数形式，我们可以从键盘以命令行的方
式输入R 1和R s及屏幕的背景色。
#include <graphics.h> /*包含图形库函数的头文件* /
#include <math.h>
#define pi 3.1415926
int m a i n ( int argc;char *argv[]; ) 
{
int x,y,r1,rs,color;
double a;
int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,"..\\bgi ")启；/动*图形工作方式*/
r1=atoi(argv[1]);/*计算基础圆半径*/
rs=atoi(argv[2]);/*计算同心圆半径*/
color=atoi(argv[3]);/*背景色*/
cleardevice();/*清除图形屏幕*/
setbkcolor(color);/*设置背景色*/
setcolor⑷；/*设置图形显示颜色*/
for(a=0;a<=2*pi;a+=pi/18)/*绘制同心圆*/
{
x=r1*cos(a)+320;
y=r1*sin(a)+240;
circle(x,y,rs);/*以圆心坐标为x、y，半径为rs画圆*/
}
getch();/*等待按键继续*/
close graph();/*关闭图形工作方式*/
return 0;
}
若程序名为L6-29.c，经编译、连结生成可执行文件L6-29.exe。在操作系统的环境下运行
程序，命令行方式为：
【
忆十
具体步骤：1、Win + R打开运行；2、输入cmd打开命令行；3、进入到要执行的exe文件所在目录，如要要执行E:\程序设计\Ctest.exe文件，则输入E:回车（注意：如果要更改其他盘目录必须首先进入要进入盘的根目录，例如进入E盘则输入E:不用输入cd E:）进入E盘根目录，再输入cd E:\程序设计 则进入了当前目录，最后就可以输入参数了，例如Ctest yishi weban回车即可（Ctest为要执行的可执行文件，后面两个也为要传递给main函数的参数）；
】
l6-29 40 20 3
则命令行与main（）函数的参数有如图6-16所示的关系
图6-16中，argv[0]是程序名，argv[1]是r1的值，
argv[2]是rs的值，argv[3]是屏幕的背景色。
由于指针数组均存放字符串，所需的圆半径及背景
色彩通过atoi（）函数转换为整型。
通过带参数的main（）函数，我们可以为自己的程序设置口令，在运行程序的命令行中给出所需的口令，正确则继续，否则退出。程序图形输出如图6-17所示。
  
[例6-30]将上述程序作修改，在程序的入口处添置密码，若给定密码正确，则显示图
形。
#include<graphics.h> 
#include <math.h>
#define pi 3.1415926
int m a i n (int argc;char *argv[];)
{
int x,y,r1,rs,color;
double a;
int gdriver=DETECT,gmode;
if (strcmp(argv[1],"pass")!=0) 设/置* 口令的比较*/
{ printf("password error!\n");
e x i t ( 0 ) ;
}
initgraph(&gdriver,&gmode,"..\\bgi ");
r1=atoi(argv[2]);
rs=atoi(argv[3]);
color=atoi(argv[4]);
cleardevice();
setbkcolor(color);
setcolor⑷；
for(a=0;a<=2*pi;a+=pi/18)
{
x=r1*cos(a)+320;
y=r1*sin(a)+240;
circle(x,y,rs);
}
getch();
closegraph();
return 0;
}
在操作系统的环境下运行程序， 命令行中增加口令“p a s s”，命令行方式为：
l6-30 pass 20 40 3 
指针数组的存储字符串如图6-18所示。
  
若给定字符串argv[1]的值是pass，则程序正确运行，否则程序退出。口令正确的情况下，显示的图形为图6-17中的一个。
函数分类
1、从用户使用的角度看，函数有两种：
⑴、标准函数，即库函数。这是由系统提供的。
⑵、用户自定义的函数。可以解决用户的专门需要。
2、从函数的形势看，函数分两类：
⑴无参函数。printstar和print_message就是无参函数。在调用无参函数时，主调函数并不将数据传送给被调用函数，一般用来执行指定的一组操作。
⑵有参函数。在调用函数时，在主调函数和被调用函数之间有数据传递。也就是说，主调函数可以将数据传递给被调用函数使用，被调用函数中的数据也可以带回来供主调函数使用。
一般形式
无参函数类型标示符 函数名（）
{声明部分
语句
}有参函数定义类型标示符 函数名 （形式参数列表）
{声明部分
语句
}可以有“空函数”它的形式为
类型说明符 函数名（）
{ }
例如：
dummy（）{}传统方式在老版本c语言中，对形参类型的声明是放在函数定义的第二行，也就是不再第一行的括号内指定形参的类型，而在括号外单独指定，例如上面定义的max函数可以写成一下形式：
int max （x，y）/*指定形参x，y*/
int x，y；/*对形参指定类型*/
{int z；
z=x>y?x:y;
return(z);
}
返回值
在 C89 标准中，main( ) 是可以接受的。Brian W. Kernighan 和 Dennis M. Ritchie 的经典巨著 The C programming Language 用的就是 main( )。不过在最新的 C99 标准中，只有以下两种定义方式是正确的：　　int main( void )　　int main( int argc, char *argv[] ) 　　main 函数的返回值类型必须是 int ，这样返回值才能传递给程序的激活者（如操作系统）。　　如果 main 函数的最后没有写 return 语句的话，C99 规定编译器要自动在生成的目标文件中（如 exe 文件）加入return 0; ，表示程序正常退出。不过，我还是建议你最好在main函数的最后加上return 语句，虽然没有这个必要，但这是一个好的习惯。 　　也就是说在最新的C语言标准中强制要求main函数的返回值类型为int，main函数的返回值是传递给操作系统，让操作系统判断程序的执行情况（是正常结束还是出现异常）