众所周知,C程序是由函数组成的。虽然在C程序中大都有且只有一个主函数(main(int argc,char argv[])),但使用程序往往由多个函数组成的。函数是C程序的基本模块,通过对函数模块的调用实现特定的功能。C语言中的函数相当于其它高级语言中的子程序。C语言不仅提供了丰富的函数库(如Turbo C,MS C都提供了三百多个函数),还允许用户建立自己定义的函数。用户可以把自己的算法编成一个个相对独立的函数模块,然后用调用的方法来使用函数。可以说C程序的全部工作都是由各式各样的函数完成的,因此C语言又称之为函数式语言。
另外,main函数是主函数,它可以调用其它函数,而不允许被其它函数调用。因此,C程序的执行总是从main函数开始的,完成对其它函数的调用后再返回到main函数,最后由main函数结束整个程序。一个C程序必须有且只有一个主函数main。
1 函数的定义
定义:多个语句的集合,构成一个函数。
- 无参函数
函数的一般形式:
类型标识符 函数名()
{(函数声明部分)
语句
}
说明:类型标识符和函数名称为函数头。类型标识符指明了本函数的类型,函数的类型实际上就是函数返回值得类型。函数名是由用户定义的标识符,函数名后有一个空括号,其中可以无参数,但是括号必须有。
{}中的内容称为函数体。在函数体中声明部分,是对函数体内部所用到的变量类型说明。
在很多情况下,不要求无参函数有返回值,此时函数类型符可以写为void。
//案例1:
void hello()
{
printf("hello world!\n");
}
//hello 为一个无参函数,因为它没有返回值,当被调用时,输出“hello world!”
- 有参函数
类型标识符 函数名(形式参数表达式)
{(函数声明部分)
语句;
}
有参函数比无参函数多了一个(形式参数表达式)。在形参表中给出的参数称为形式参数(简称“形参”),多个形参之间用逗号隔开。在进行调用时,主函数将赋予这些形参实际值。既然,形参为变量,那么在形参表中给出形参的类型说明。
// 案例2:
int min (int a, int b) //说明min函数为整型函数,且有整型返回值,a,b均为形参变量
{
if (a>b)
return b;
else
return a;
}
2 函数的调用
- C语言中函数调用的一般形式:
函数名(实参表达式)
对于无参函数调用时则无实际参数表。实际参数表中的参数可以是常量,变量或者其它构造类型数据及表达式。各实际参数之间用逗号分隔开。 - 函数调用的方法
1.函数表达式:函数作为表达式中的一类,以函数返回值参与表达式的运算。
2.函数语句:函数调用的一般形式加上分号,即构成函数语句。例如printf("%d\n",s);scanf("%d",a)。
3.函数实参:函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行传送,因此要求该函数必须是有返回值的。
注意:在调用函数的时候,被调用的函数一定在调用前进行声明。
3 函数的声明
告诉被调用者,函数是存在的,是被定义过的。
一般形式:
类型说明符 被调用函数名(类型 形参,类型 形参…)
或:
类型说明符 被调用函数名(类型 类型…)
注意:括号内只给出形参和类型,或只给出类型,从而方便编译系统进行检错,以防止可能出现的错误。
int max (int a,int b)
// 也可以写为:
int max (int ,int)
定义函数注意事项:
1.函数内部不允许定义函数;
2.如果函数的数据类型是void的,那么可以有return,也可以没有return。如果有return,后面不能有值。
3.如果函数的数据类型是非void类型,那么必须要有一个return,而且return后面必须要有值(可以是常量,也可以是变量),且值得数据类型必须和函数的数据类型保持一致。
4 return的作用
1.当函数碰到return,return后面的代码将不会被执行,标志着函数的结束。
2.将信息返回给函数的调用者
#include <stdio.h>
int sum(inta,int b)
{
c=a+b;
return c;
}
int main()
{
int a=1,b=2;
int c=sum(a,b);
printf ("c=%d\n",c);
return 0;
}
5 函数和数组的关系
数组可以作为函数的参数使用,进行数据传送。有两种形式:
1 数组元素作为函数实参
数组元素作为函数实参使用与普通变量是相同的,在函数调用时,把作为实参的数组元素的值传送给形参,实现单向的值传送。
练习:判断一个整数数组中的元素,若大于零输出,若小于零输出零。
#include<stdio.h>
void nzp(int b)
{
if(b>0)
{
printf("%d",b);
}
else
{
printf("%d",0);
}
}
int main()
{
int a[5],i;
for (i=0;i<5;i++)
{
printf("input a number:");
scanf("%d",&a[i]);
nzp(a[i]);
}
}
2.数组名作为函数参数
练习:求一个整型数组元素的平均值
#include<stdio.h>
int aver(int a[5])
{
int ave=0,i;
for(i=0;i<5;i++)
{
ave+=a[i];
}
ave/=5;
return ave;
}
int main()
{
int a[5],i;
for(i=0;i<5;i++)
{
printf("input a number:");
scanf("%d",&a[i]);
}
int ave=aver(a);
printf("%d\n",ave);
return 0;
}
用数组名作为函数参数时,应注意:
1.形参数组和实参数组的必须一致;
2.形参数组和实参数组的长度可以不同,因此在调用时,只传首地址而不检查形参数组的长度。当形参数组的长度和实参数组的长度不一致时,虽然不会出现语法错误,但执行程序结果将与实际不符时,需要注意。