第九章------函数
本章介绍以下内容:
- 关键字:return
- 运算符:*(一元),&(一元)
- 函数及其定义方式
- 如何使用参数和返回值
- 如何把指针变量用作函数参数
- 函数类型
- ANSIC原型
- 递归
如何组织程序?C的设计思想是,把函数用作构建快。我们已经用过C标准库的函数,如printf()、scanf()、getchar()、strlen()。接下来要研究的是自己创建函数。前面的章节书上已经有过介绍了,接下来就是巩固之前所学习的知识并进一步拓展。
复习函数
函数(function)是完成特定任务的独立代码单元。虽然C中的函数和其他语言中的函数、子程序、方法、过程作用相同,但是细节上略有不同。一些还是执行某个动作,如printf()把数据打印到屏幕上;一些函数找出一个值提供给程序使用,如strlen()把指定字符串的长度返回给程序。
为什么要使用函数?
- 提高代码复用性。如果一个程序要多次完成某个任务,那么只要编写一个合适的函数来重复使用,就可以避免重复出现大段大段相同功能的代码,只要使用这个函数就可以解决问题。或者在不同的程序中也可以使用该函数。
- 函数让程序模块化,增加可读性。即使出现只需要完成某任务一次,也值得用函数。
- 读入一系列数字;
- 分类这些数字;
- 找出这些数字的平均值;
- 打印一份柱状图;
函数可以看作是根据传入信息(输入)及其生成的值或响应的动作(输出)来定义的“黑盒”。如果不是自己写的函数根本不用关心黑盒里面的内容(比如printf()),把注意力集中在程序的整体设计上,而不是某些函数实现的细节上。
接下来,了解一下如何正确的定义函数、如何调用函数和建立函数间的通信。
本章的第一个程序:
/*lethead1.c*/
#include<stdio.h>
#define NAME "GIGATHINK,INC"
#define ADDRESS "101 Megabake Plazz"
#define PLACE "Megapolie, CA 94904"
#define WIDTH 40
void starbar(void); //函数原型
int main (void)
{
starbar(); //使用函数
printf("%s\n", NAME);
printf("%s\n", ADDRESS);
printf("%s\n", PLACE);
starbar();
return 0;
}
void starbar (void){//定义函数
int count;
for(count = 1; count <= WIDTH; count++){
putchar('*');
}
putchar('\n');
}
运行结果如下:
****************************************
GIGATHINK,INC
101 Megabake Plazz
Megapolie, CA 94904
****************************************
分析:
- 程序在三各地方使用到了starbar标识符:函数原型,告诉编译器函数starbar()的类型;函数调用,表明此处执行函数;函数定义,指定了函数要做什么。
- 函数和变量一样,有多种类型(void,int,double... ...)。任何程序在使用函数前都要声明函数的类型。
void starbar(void); //函数原型
这一行中含有圆括号()表明了starbar是一个还是名。第一个void是函数类型,表明函数没有返回值。第二个void(在圆括号中)表明函数不带参数。“;”表明这是声明函数,不是定义函数。一般而言,函数原型会指明返回值类型和接收的参数类型, 在这里程序将使用一个名为starbar()、没有返回值的无参函数,并告诉编译器去别处找函数定义。
- 程序将starbar()函数原型至于main()前面,放在别处也是可以的。
- 在main()的执行过程中调用了starbar()函数:
starbar(); //使用函数
这是调用void类型函数的一种形式。当执行到”starbar();“语句四,会找到函数定义并执行其中的内容。执行完starbar()中的代码计算机会返回继续执行main()下一行
- 程序中starbar()和main()的定义形式相同。注意,这里的函数头starbar()后面就不带有“;”了,是告诉编译器这里是定义starbar(),而不是调用或声明。
- 程序把starbar()和main()放在同一个文件中(当然也可以放在两个文件中,后面说)。
- starbar()函数中的变量count使局部变量,该变量只属于starbar()。在程序其他地方定义使用count变量都与这里的count无关,他们是不同的变量。
如果把starbar()看作是一个黑盒,那么它的行为是打印一行“*”不用给该函数提供任何输入,因为调用它不需要其他任何信息。同时starbar()也没有返回值,所以它也不会提供main()如何信息。简而言之就是starbar()不需要与主函数通信。