本章的标题是函数。C的设计原则是把函数作为程序的构成模块。
1.函数概述
函数的定义:函数是用于完成特定任务的程序代码的自包含单元。
使用函数的原因:1.函数的使用可以省去重复代码的编写。2.使得程序模块化,更有利于阅读、修改和完善。以这种方式看待函数有利于把精力投入到程序整体设计而不是实现其细节。
函数同变量一样有多种类型。任何程序在使用函数之前都需要声明该函数类型。
函数参数、函数类型没啥说的,其他语言都会讲到。
PS:函数的结尾最好只使用一次return,这样更有利于阅读程序的人明白函数的执行流程。
2.递归
递归一般可以代替循环语句使用。有些情况下使用循环语句比较好,有时候使用递归更有效。递归方法虽然使程序结构优美,但其执行效率却没有循环语句高。一般情况下,选择循环更好一点。首先,因为每次递归调用都有自己的变量集合,所以需要比较多的内存; 第二,每次函数调用需要花费一定的时间,所以执行速度慢。但是在某些情况下,我们不能用简单的循环语句代替递归,所以有必要学习递归。
#include "stdio.h" void up_and_down (int); int main (void) { up_and_down (1); return 0; } void up_and_down (int n) { printf ("Level %d: n location %p\n", n, &n); if (n < 4) up_and_down (n+1); printf ("Level %d: n location %p\n", n, &n); }
这个程序是典型的递归,运行结果如下,关键是理解堆栈的原理。
3.多源代码文件程序的编译
一般可以把多个函数放到同一个文件,还可以使用头文件,把函数原型都放到一个头文件中。
4.地址运算符
一元运算符&可以取得变量的存储地址。%p是输出地址的说明符。
下面引入指针的概念。指针是一个其数值为地址的变量。间接运算符*能够得到指针指向的变量的数值。声明指针时候,需要指针所指向的变量的类型,例如
int * pi;
pi的值是一个地址,在大多数系统中,pi的值是一个地址,在大多数系统中,它是由一个无符号整数表示,但是这并不表示可以把指针看作整数类型,因为指针是一种新的数据类型。
如何理解变量名,地址和数值:一个变量一般有两个属性:变量名和数值。程序被编译和加载后,同一个变量在计算机中的两个属性是地址和数值。变量的地址可以被看作是在计算机中的变量名。在很多编程语言中,变量地址只由计算机处理,对于编程人员完全不可见,但在在C语言中,可以使用运算符&来对变量地址进行操作。
编程练习比较简单,难度不超过书中的代码示例。
to be continued。。。