C语言函数的声明和定义(非常详细)
大型程序一般会被分为若干个程序模块,每个模块实现一个特定功能。C语言中,由函数实现子程序,由子程序实现模块功能。
构成 C 程序的基本单元是函数,函数中包含着程序的可执行代码。
每个 C程序的入口和出口都位于 main() 函数中,但并不需要把所有指令都放在 main() 函数中。一般的做法是将程序划分成若干个模块,每个模块完成一部分功能,不同的程序模块可以由不同的人来完成,从而提高软件开发的效率。
这就好比是盖楼房,一栋摩天大楼是不可能靠一个人完成的,而要靠多部门、多工种之间协力完成。通常是有一个总工程师,在他的指挥下,有部门运输建筑材料,有部门建造楼房主体,还有部门粉刷内外墙涂料。
编写程序的道理与盖楼是一样的,主函数就像总工程师一样,控制着整体程序的推进和执行,其中定义的其他函数就好比参与盖楼的多个部门或工种,他们要通过某种调度(函数调用)才能完成特定的功能。
主函数可以调用其他函数,其他函数间也可以相互调用。函数可以有参数和返回值,通过它们实现数据间的传递。
在主函数中调用其他函数,这些函数执行完毕之后会返回 main() 函数中。通常把这些被调用的函数称为下层函数。函数调用发生时,立即执行被调用的函数,而调用者则进入等待的状态,直到被调用函数执行完毕。
例如,定义 3 个函数来完成做饭、钓鱼、写诗等特定的功能,然后在主函数中调用它们。为了简化函数的功能,这里只让其输出一条提示信息。读者可通过本实例对函数有一个直观的认识。
运行程序,结果为:
首先来看一段代码,然后通过分解,了解函数的构成:

图 1 函数头组成
在上面的代码中,函数体内首先定义了一个 int 型变量,用来保存加法的计算结果,之后利用传递进来的参数进行加法操作,并将结果保存在 result 变量中,最后函数要将所得到的结果进行返回。通过这些语句的操作,实现了求解两数和的特定功能。
在定义函数时会出现以下几种特殊的情况:
1) 无参函数:没有参数列表的函数。如前面实例中的 Cook、Fish、Poem 都是无参函数。
2) 空函数:没有任何内容,也没有什么实际功能的函数。空函数的形式如下:
注意,C语言中函数的定义是互相平行、独立的。也就是说,函数体内不能再包含其他函数的定义。例如,下面的代码是错误的:
函数定义是为了让编译器知道函数的功能,而函数声明是为了让编译器预先知道有这么一个函数,以及函数的名称、参数、返回值类型等信息。
函数声明的一般形式如下:
【实例】交换两个数值。
2) 在 main() 函数体中,首先定义两个整型变量 a、b,之后输出一条提示消息,然后调用 exchange() 函数。
3) 在 main() 函数的定义之后可以看到 exchange() 函数的定义,功能是实现两个数的数值互换。
运行程序,结果为:
构成 C 程序的基本单元是函数,函数中包含着程序的可执行代码。
每个 C程序的入口和出口都位于 main() 函数中,但并不需要把所有指令都放在 main() 函数中。一般的做法是将程序划分成若干个模块,每个模块完成一部分功能,不同的程序模块可以由不同的人来完成,从而提高软件开发的效率。
这就好比是盖楼房,一栋摩天大楼是不可能靠一个人完成的,而要靠多部门、多工种之间协力完成。通常是有一个总工程师,在他的指挥下,有部门运输建筑材料,有部门建造楼房主体,还有部门粉刷内外墙涂料。
编写程序的道理与盖楼是一样的,主函数就像总工程师一样,控制着整体程序的推进和执行,其中定义的其他函数就好比参与盖楼的多个部门或工种,他们要通过某种调度(函数调用)才能完成特定的功能。
主函数可以调用其他函数,其他函数间也可以相互调用。函数可以有参数和返回值,通过它们实现数据间的传递。
在主函数中调用其他函数,这些函数执行完毕之后会返回 main() 函数中。通常把这些被调用的函数称为下层函数。函数调用发生时,立即执行被调用的函数,而调用者则进入等待的状态,直到被调用函数执行完毕。
例如,定义 3 个函数来完成做饭、钓鱼、写诗等特定的功能,然后在主函数中调用它们。为了简化函数的功能,这里只让其输出一条提示信息。读者可通过本实例对函数有一个直观的认识。
#include<stdio.h> /*包含头文件*/ void Cook(); /*声明 Cook 函数*/ void Fish(); /*声明 Fish 函数*/ void Poem(); /*声明 Poem 函数*/ int main() /*主函数 main*/ { Cook(); /*调用 Cook 函数*/ Fish(); /*调用 Fish 函数*/ Poem(); /*调用 Poem 函数*/ return 0; } void Cook() /*自定义 Cook 函数*/ { printf("会做饭\n"); } void Fish() /*自定义 Fish 函数*/ { printf("会钓鱼\n"); } void Poem() /*自定义 Poem 函数*/ { printf("会写诗\n"); }程序中声明了 3 个自定义函数,最后在主函数 main() 中调用了这 3 个函数。在主函数 main() 外,可以看到这 3 个函数的定义。
运行程序,结果为:
会做饭
会钓鱼
会写诗
C语言函数的定义
一个函数应包括函数头和函数体。定义一个函数的语法格式如下:返回值类型 函数名(参数列表) { 函数体 /*函数实现特定功能的过程*/ }
首先来看一段代码,然后通过分解,了解函数的构成:
int AddTwoNumber(int iNum1, int iNum2) /*函数头部分*/ { int result; /*定义整型变量*/ result = iNum1 + iNum2; /*进行加法操作*/ return result; /*返回操作结果,结束*/ }
1) 函数头
函数头是函数的入口,标志着一段函数代码的开始。函数头包括返回值类型、函数名和参数列表 3 个部分,如下图所示。
图 1 函数头组成
- 返回值类型:函数返回值的类型,必须是 C语言中的某个数据类型。这里函数的返回值将是一个 int 型值。
- 函数名:函数的标识符,在一个 C程序中应保持唯一。因为是标识符,所以函数名要遵守标识符命名规则。这里,函数名是 AddTwoNumber,可以推测出该函数的功能是两数相加求和。
- 参数列表:调用函数时,用于将主调函数中的实际参数复制到该列表对应的形式参数中。可以没有参数,也可以有多个参数。这里定义了两个 int 变量,表示要相加的两个数。
2) 函数体
函数体位于函数头的下方位置,由一对大括号括起来,大括号决定了函数体的范围。函数要实现的特定功能,都是在函数体部分通过代码语句完成的,最后通过 return 语句返回实现的结果。在上面的代码中,函数体内首先定义了一个 int 型变量,用来保存加法的计算结果,之后利用传递进来的参数进行加法操作,并将结果保存在 result 变量中,最后函数要将所得到的结果进行返回。通过这些语句的操作,实现了求解两数和的特定功能。
在定义函数时会出现以下几种特殊的情况:
1) 无参函数:没有参数列表的函数。如前面实例中的 Cook、Fish、Poem 都是无参函数。
2) 空函数:没有任何内容,也没有什么实际功能的函数。空函数的形式如下:
类型说明符 函数名() { }实际开发中,有时某个函数还未编好,或者后续要拓展某个函数,这时就会先用一个空函数代替,先占个位置,待后续时机成熟再用编好的函数取代它。
注意,C语言中函数的定义是互相平行、独立的。也就是说,函数体内不能再包含其他函数的定义。例如,下面的代码是错误的:
int main() { void Display() /*错误!不能在函数体内定义另一个函数*/ { printf("I want to show the Nesting function"); } return 0; }这里,主函数 main() 中定义了一个 Display() 函数,目的是输出一句提示。由于 C语言不允许进行嵌套定义,因此编译时会出现下面的错误提示:
[Error] a function-definition is not allowed here before '{' token
C语言函数的声明
在程序中编写函数时,要先对函数进行声明,再对函数进行定义。函数定义是为了让编译器知道函数的功能,而函数声明是为了让编译器预先知道有这么一个函数,以及函数的名称、参数、返回值类型等信息。
函数声明的一般形式如下:
返回值类型 函数名(参数列表);要注意的是,函数声明语句的最后要用分号“;”作为结尾。例如,声明一个函数的代码如下:
Int ShowNumber(int iNumber);
【实例】交换两个数值。
#include<stdio.h> void exchange(int a, int b); /*声明 exchange 函数*/ int main() { int a=3, b=4; /*定义整型变量*/ printf("交换之前的值 a=%d,b=%d\n", a, b); /*提示信息*/ exchange(a, b); /*调用 exchange 函数*/ return 0; } void exchange(int a, int b) /*定义 exchange 函数,用于交换两个数*/ { int c; /*交换数值*/ c = a; a = b; b = c; printf("交换后的值 a=%d,b=%d\n", a, b); /*输出交换之后的数据*/ }1) 观察上面的程序,可以看到在 main() 函数的开头先进行了 exchange() 函数的声明,声明的作用是告知其函数将在后面进行定义。
2) 在 main() 函数体中,首先定义两个整型变量 a、b,之后输出一条提示消息,然后调用 exchange() 函数。
3) 在 main() 函数的定义之后可以看到 exchange() 函数的定义,功能是实现两个数的数值互换。
运行程序,结果为:
交换之前的值 a=3,b=4
交换后的值 a=4,b=3