一、变量的存储类别
(一)局部变量和全局变量
- 局部变量:在函数内部定义的变量,只在本函数范围内有效。不同函数中可以使用相同名字的局部变量,它们互不干扰。形式参数和在复合语句中定义的变量也属于局部变量。局部变量属于动态存储方式,在函数调用时分配存储空间,函数结束时自动释放。
- 全局变量:在函数之外定义的变量,其有效范围为从定义变量的位置开始到本源文件结束。全局变量可以为本文件中其他函数所共用,增加了函数间数据联系的渠道。但全局变量在程序整个运行期间都占用存储单元,会使函数的通用性降低,且降低程序的清晰性,容易导致错误,因此应谨慎使用。若外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,不起作用。
(二)动态存储方式与静态存储方式
- 动态存储方式:包括自动变量(未加
static
声明的局部变量)和函数形式参数等,它们的数据存储在动态存储区中,在函数调用时分配存储空间,函数结束时释放。 - 静态存储方式:包括全局变量和用
static
声明的局部变量等,它们的数据存储在静态存储区中,在程序运行期间不释放。
(三)具体的存储类别
- auto变量:函数中的局部变量,如果不专门声明为
static
存储类别,都是动态地分配存储空间的,数据存储在动态存储区中。函数中的形参和在函数中定义的变量(包括在复合语句中定义的变量),都属此类。实际上,关键字“auto”可以省略,隐含确定为“自动存储类别”。 - static变量:
- 静态局部变量:用
static
声明的局部变量,属于静态存储类别。在编译时赋初值,只赋初值一次,在程序运行时已有初值,以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。若未赋初值,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。静态局部变量的作用是在函数调用结束后保留变量的值,例如可以用它来计算函数调用的次数或保留上一次计算的结果。 - 静态外部变量:用
static
声明的外部变量,只能被本文件引用。这样可以避免其他文件误引用本文件的外部变量,提高程序的模块化和通用性。
- 静态局部变量:用
- register变量:将局部变量声明为寄存器变量,可提高程序的执行效率。因为寄存器的存取速度远高于内存的存取速度。但寄存器数量有限,且局部静态变量不能定义为寄存器变量。此外,当今的优化编译系统能够自动识别使用频繁的变量并将其放在寄存器中,所以实际上用
register
声明变量并不是必需的。 - extern变量:用
extern
声明外部变量,可扩展其在程序文件中的作用域。- 在一个文件内声明外部变量:如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件结束。如果在定义点之前的函数想引用该外部变量,则应该在引用之前用
extern
对该变量作“外部变量声明”。 - 在多文件的程序中声明外部变量:一个C程序可以由多个源程序文件组成,如果在一个文件中想引用另一个文件中已定义的外部变量,需要在引用的文件中用
extern
对该变量作声明。同时,需要注意的是,用extern
声明的变量必须是已经在其他文件中定义过的,否则会出现错误。
- 在一个文件内声明外部变量:如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件结束。如果在定义点之前的函数想引用该外部变量,则应该在引用之前用
二、内部函数和外部函数
(一)内部函数
用static
声明的函数称为内部函数,它只能被本文件中其他函数调用。使用内部函数,可以使函数的作用域只局限于所在文件,在不同的文件中有同名的内部函数,互不干扰。这样可以避免函数被其他文件误用,提高程序的安全性和可靠性。
(二)外部函数
- 在定义函数时,如果在函数首部的最左端加关键字
extern
(或省略extern
),则表示此函数是外部函数,可供其他文件调用。 - 在需要调用此函数的文件中,用
extern
对函数作声明,表示该函数是在其他文件中定义的外部函数。通过这种方式,可以在一个文件中调用其他文件中定义的函数,实现函数的复用和代码的共享。
三、预处理命令
(一)宏定义
- 不带参数的宏定义:用一个指定的标识符(即名字)来代表一个字符串,其一般形式为
#define 标识符 字符串
。在编译预处理时,将程序中在该命令以后出现的所有的标识符都用指定的字符串代替。宏名一般用大写字母表示,宏定义不是C语句,不必在行末加分号。 - 带参数的宏定义:其一般形式为
#define 宏名(参数表) 字符串
。在程序中使用带实参的宏时,将实参字符串代替宏定义中的形参。使用带参数的宏时,需要注意参数的替换规则和括号的使用,以避免出现意外的结果。
(二)文件包含
使用#include
命令可以实现“文件包含”的操作,其一般形式为#include "文件名" 或 #include <文件名>
。通过“文件包含”,可以将一个文件的内容包含到另一个文件中,减少代码的重复编写,提高代码的可维护性。