"对被调用函数的声明和函数原型-谭浩强c语言第七章ppt"
在C语言中,函数是实现模块化程序设计的基本单位,它允许我们将复杂的任务分解成一系列更小、更易管理的子任务。第7章主要讲解了如何使用函数来实现模块化程序设计,包括函数的定义、调用、声明和原型,以及函数的嵌套调用、递归调用等重要概念。
7.4 对被调用函数的声明和函数原型
在C语言中,当在一个函数内部调用另一个函数时,需要满足以下条件:
1. **被调用函数必须是已定义的**:无论是库函数(如`printf`、`scanf`等)还是用户自定义的函数,调用前必须确保该函数的定义存在。对于库函数,通常在源代码开头通过`#include`指令引入对应的头文件。例如,要使用`printf`函数,需包含`<stdio.h>`。
2. **函数声明**:如果自定义函数的定义位于调用它的函数之后,那么在调用之前,需要对被调用的函数进行声明。声明函数告诉编译器函数的名称、返回类型以及参数列表,这样编译器在遇到调用时就能知道如何处理。例如,一个简单的声明:
```c
int add(int a, int b); // 声明一个名为add的函数,返回int类型,接受两个int类型的参数
```
3. **函数原型**:函数声明通常也被称为函数原型,它提供了函数的基本信息,包括函数名、返回类型和参数列表。函数原型是函数声明的一种形式,但通常用于头文件中,以便在不同的源文件之间共享函数信息。例如:
```c
int add(int, int); // 函数原型
```
7.5 函数的嵌套调用
函数可以嵌套调用,即一个函数可以在执行过程中调用另一个函数。这种特性增强了代码的灵活性和复用性。例如,一个计算阶乘的函数可能需要调用一个计算乘积的函数。
7.6 函数的递归调用
递归调用是指函数在其定义中调用自身。递归通常用于解决那些可以通过简化自身来解决问题的问题。例如,计算阶乘可以使用递归函数实现:
```c
int factorial(int n) {
if (n == 0) return 1; // 递归基
else return n * factorial(n - 1); // 递归调用
}
```
7.7 数组作为函数参数
在C语言中,可以将整个数组或者数组的一部分作为函数参数。传递数组时,通常只传递数组首地址,因为数组名在大多数情况下相当于指向其首元素的指针。
7.8 局部变量和全局变量
局部变量是在函数内部定义的,仅在该函数内部可见,当函数执行完毕,局部变量的内存会被释放。全局变量在整个程序范围内都有效,但过度使用全局变量可能导致命名冲突和程序难以维护。
7.9 变量的存储方式和生存期
C语言中的变量有多种存储类别,包括自动(栈)、静态、寄存器和外部。每种存储类别的变量有不同的生命周期和作用域。
7.10 关于变量的声明和定义
声明变量告知编译器变量的类型和名称,而定义变量则分配内存并初始化。在C语言中,声明和定义通常是同时进行的,但某些情况下可以分开,比如在头文件中声明,在源文件中定义。
7.11 内部函数和外部函数
内部函数(static修饰的函数)只在定义它的源文件内可见,外部函数(默认或extern修饰的函数)可以被其他源文件调用,实现了不同源文件间的函数交互。
总结来说,本章内容强调了函数在C语言中的核心地位,以及如何有效地使用函数进行程序设计,包括声明、定义、调用和优化,以实现更清晰、更易于维护的代码结构。通过合理地运用这些知识点,开发者能够编写出高效、模块化的C语言程序。