第9章 函数
函数是C语言程序的构件块。
这章书里举了很多例子,建议结合例子理解。
9.3 和 9.4 建议略读。
9.1 复习函数
函数(function)是完成特定任务的独立代码单元。
函数让程序更加模块化,提高代码可读性,方便修改。
9.1.1 创建并使用简单函数
函数原型指明了函数的返回值类型和函数接受的参数类型。这些信息称为该函数的签名(signature)
9.1.3 函数参数
9.1.4 定义带形式参数的函数
ANSI C风格的函数头:
void show_n_char(char ch, int num)
改行告知编译器本函数具有两个参数ch和num,类型分别是char和int。这两个参数被称为形式参数(formal parameter),简称形参。形式参数是局部变量。
注意每个变量前都要声明其类型,不能写成这样:void dibs(int x, y, z)
9.1.5 声明带形式参数函数的原型
函数原型一般是下面这种形式:
void show_n_char(char ch, int num)
也可以省略变量名:
void show_n_char(char, num)
9.1.6 调用带实际参数的函数
函数调用中,实际参数(actual argument,简称实参)提供了ch和num的值。
show_n_char(SPACE,12)
调用时实参的值(SPACE,12)赋值给函数中相应的形式参数(ch,num)。
9.1.7 黑盒视角
9.1.8 使用return从函数中返回值
9.1.9 函数类型
声明函数时必须声明函数的类型,带返回值的函数类型和其返回值类型相同,
不带返回值的函数应该声明为void类型。
9.2 ANSI C函数原型
9.2.1 问题所在
9.2.2ANSI的解决方案
针对参数不匹配的问题,ANSI C要求函数声明时还要声明变量的类型,即 使用函数原型来声明函数的返回类型、参数的数量和每个参数的类型。有了这些信息,编译器可以检查函数调用是否和函数原型匹配。
9.2.3 无参数和未指定参数
为了表明函数没有参数,应该在圆括号内使用void
void print_name(void);
一些函数接受许多参数,ANSI C允许使用部分原型:
int printf(const char *, ...)
表明第一个参数是字符串,可能还有其他参数。
9.2.4 函数原型的优点
让编译器在第1次执行到该函数前就知道如何使用它。
将整个函数定义放在第1次调用该函数之前,也有同样的效果。
此时,函数定义也相当于函数原型。
9.3 递归(略)
C允许函数调用自己,这种调用称为递归(recursion)。
9.3.3 尾递归
最简单的递归形式是把递归调用置于函数的末尾,即return之前。这种形式的递归称为尾递归。
9.3.4 递归和倒序计算
9.3.5 递归的优缺点
9.4 编译多源代码文件的程序(略)
9.5 查找地址:&运算符
指针(pointer)是C语言最重要的概念之一,用于存储变量的地址。
&运算符给出变量的地址,pooh是变量,&pooh就是变量pooh的地址。
9.6更改主调函数中的变量
9.7 指针简介
指针(pointer)是一个值为内存地址的变量。
9.7.1 间接运算符:*
假设ptr指向bah:
ptr = &bah;
使用简介运算符* 可以找出bah中的值
val = *ptr;
9.7.2 声明指针
声明指针变量时必须指定指针所指向变量的类型,因为不同的变量类型占用不同的存储空间。
下面是一些指针的声明:
int * pi; //pi 是指向int变量的指针
float * pf, *pg
9.7.3 使用指针在函数间通信
使用指针的函数
void interchange(int * u, int * v)
调用:interchange(&a,&b);