第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);