9.1 函数描述
- 函数(function)是用于完成特定任务的程序代码的自包含单元。一个简单函数:
/* lesser.c -- finds the lesser of two evils */
#include <stdio.h>
int imin(int n,int m); /* prototype the function */
int main(void)
{
int evil1, evil2;
printf("Enter a pair of integers (q to quit):\n");
while (scanf("%d %d", &evil1, &evil2) == 2)
{
printf("The lesser of %d and %d is %d.\n",
evil1, evil2, imin(evil1,evil2)); /* use the function */
printf("Enter a pair of integers (q to quit):\n");
}
printf("Bye.\n");
return 0;
}
int imin(int n,int m)
{
int min;
if (n < m)
min = n;
else
min = m;
return min;
}
程序分析:imin 标识符在不同位置出现了三次:
- 函数原型(function prototype)告知编译器 imin() 的函数类型。
- 函数调用(function call)导致 imin() 函数的执行。
- 函数定义(function definition)确切指定 imin() 函数的具体功能。
一、原型声明
- 使用函数前需要用 ANSI 原型声明该函数。函数原型声明返回值类型、参数个数及各参数的类型。
int imin(int n,int m); /* prototype the function */
/* 使用逗号分隔的类型列表指明参数的个数和类型 */
int imin(int, int); /* prototype the function */
/* 可以根据个人喜好省略变量名 */
二、函数调用
- 函数调用导致该函数的执行:
imin(evil1,evil2); /* use the function */
- evil1 和 evil2 被称为实际参数。实际参数可以是常量、变量或表达式。
三、函数定义
- 函数定义以 ANSI C 函数头开始,且ANSI C 要求在每个变量前声明其类型:
int imin(int n,int m)
- 变量 n 和 m 被称为形式参量。形式参量是局部变量,与其他函数中的变量(即使同名)相互独立、互不影响。
四、使用 return 从函数中返回一个值
- 在一个具有返回值的函数中,关键字 return 指明了其后的表达式即是该函数的返回值。
- return 语句的另一作用是终止执行函数,并把控制返回给调用函数的下一语句,即使 return 语句不是函数的最后一个语句。
- 许多 C 程序员更倾向于只在函数结尾使用一次 return 语句。
9.3 递归
C 允许一个函数调用其本身。这种调用过程被称作递归(recursion)。
- 优点:在某些编程问题上,递归提供了最简单的解决方法。
- 缺点:一些递归算法会很快耗尽计算机的内存资源;递归的程序难于阅读和维护。
9.4 多源代码文件程序的编译
- 在 Windows 系统下的编译器是面向工程的。工程(project)描述了一个特定的程序所使用的资源。这些资源包括源代码文件。使用这种编译器运行单文件程序时,必须创建工程。而对于多文件程序,需要将源代码文件加入到一个工程之中,且工程必须包括所有的源代码文件(.c 文件),但头文件(.h 文件)不能包含在工程之中。因为工程只管理所使用的源代码文件,而使用哪些头文件需要由源代码文件中的 #include 指令确定。
- 把函数原型和常量定义放在一个头文件中是一个和好的变成习惯。
9.5 地址运算符:&
- 一元地址运算符 & 可以取得变量的存储地址。变量的地址可以看作是该变量在内存中的位置。
/* 假设 pooh 是一个变量名,那么 &pooh 就是该变量的地址. */
/* 假定 pooh 赋值为24,pooh 的存储地址是0B76,那么语句: */
pooh = 24;
printf("%d %p", pooh, &pooh);
/* 将输出如下数值(%p 是输出地址的说明符): */
24 0B76
9.7 指针简介
- 指针是一个其数值为地址的变量(更一般地说是一个数据对象)。
- 普通的变量把它的数值作为基本数值量,而通过使用地址运算符&将它的地址作为间接数值量。
- 对指针来说,它把地址作为基本数值量,而通过使用间接运算符*将地址中存储的数值作为间接数值量。
/* 若某个指针变量名为ptr */
ptr = & pooh; /* 把pooh的地址赋给ptr,注意&pooh是一个常量,而ptr是一个变量 */
- 间接运算符:*
/* 若某个指针变量名为ptr */
ptr = & pooh; /* 把pooh的地址赋给ptr,注意&pooh是一个常量,而ptr是一个变量 */
val = * ptr; /* 使用间接运算符*来获取pooh中存放的数值 */
- 指针声明
int * pi; /* 类型标识符表明了被指向变量的类型,星号(*)表明变量pi为一指针 */
- 使用指针在函数间通信:使用函数交换 x 和 y 的值。
/* swap3.c -- using pointers to make swapping work */
#include <stdio.h>
void interchange(int * u, int * v);
int main(void)
{
int x = 5, y = 10;
printf("Originally x = %d and y = %d.\n", x, y);
interchange(&x, &y); /* send addresses to function */
printf("Now x = %d and y = %d.\n", x, y);
return 0;
}
void interchange(int * u, int * v) /* u的值为&x,*u代表x的值 */
{
int temp;
temp = *u; /* temp gets value that u points to */
*u = *v;
*v = temp;
}