4.4 作用域规则
外部变量和函数的作用域是从它们声明的地方到文件的结尾
如果要在外部变量之前使用变量,或者外部变量在另一个文件中要使用变量时,必须用extern关键字进行声明。注意声明与定义的区别,变量在被定义时分配了存储空间,而声明并没有重新建立变量或分配空间。
4.5 头文件
在实际的大型程序中,往往会把程序放在多个文件中,不同的文件一般完成指定的功能,如4.3中的例子,可以把push与pop函数及相关声明放在stack.c文件中,把getop放在getop.c文件中,把getch与ungetch放在getch.c文件中,而几个文件可能共用了一些定义与声明,我们可以将他们在放一个单独的头文件cal.h里。
4.6 静态变量
外部变量或函数前面加上关键字 static后,该外部变量或函数只能被所在的文件所引用,不能被其他文件使用。
自动变量前面加上关键字statci后,该变量会一直存在内存中,不会因为程序块或函数的退出而消失。
4.7 寄存器变量
如要某些变量在程序中使用的频率很高,则可以声明为寄存器变量,寄存器变量只能适用于自动变量及函数参数的形式:
f(register unsigned m,register long n) { register int i; ... }
寄存器变量表明变量保存在系统的寄存器里,值得注意的就是寄存器变量是没有地址的。
4.8 程序块结构
程序块中的变量属于自动变量,其变量名可以与程序块外面的变量名重复,应该区别对待。
4.9 初始化
在不进行显式初始化的情况下,外部变量与静态变量被初始化为0,自动变量与寄存器变量的初值没有意义。
数组与字符数组的初始化,字符数组可以直接用一个字符串来进行初始化。
4.10 递归
C语言中允许让函数本身调用本身,这种形式叫递归,递归并不节省存储器的开销,因为在递归的过程中系统必须维护一个存储处理值的栈,递归的执行速度并不快,但是程序会比较紧凑。
下面通过一个快速排序的例子说明函数的递归调用,程序先选取数组中间的一个元素作为阈值,将数组分为2部分,比阈值小的和比阈值大的,然后再把两个子数组依次分类下去,直到子数组只有一个数字为止。
/*快速排序的递归写法*/ void Qsort(int ar[],int left,