变量
局部变量
在函数内部定义的变量,称为局部变量。 函数的形参也是局部变量
全局变量
所有在函数外部定义的变量,称为全局变量
全局变量的作用范围是从定义变量的位置开始到源程序结束,即全局变量可以被在其定义位置之后的其它函数所共享。
变量的存储类型
C语言根据变量的存储类型(变量存储的位置:1. 运行时堆栈 2.普通内存 3.寄存器)的不同,可以把变量分为:自动变量、静态变量、寄存器变量
- 哪些是自动变量:被关键字auto修饰的局部变量都是自动变量,但是极少使用这个关键字,
基本上是废的,因为所有的局部变量在默认情况下都是自动变量。存于堆栈
- 哪些是静态变量: 存于内存,程序结束才销毁
- 所有的全局变量都是静态变量
- 被关键字static修饰的局部变量也是静态变量
- 哪些变量是寄存器变量:
- 被关键字register修饰的局部(自动)变量都是寄存器变量
- 只有局部变量才可以是寄存器变量,全局变量和静态局部变量不行
- 寄存器变量只限于int、char和指针类型变量使用
static与全局变量、局部变量
static修饰的变量,其生命周期是存活于整个程序的运行期间的。
静态局部变量
因其生命周期原因,所以值的变化,会影响之后的操作。
|
|
上例,会输出;9 10 11 12 13
静态全局变量
定义在函数外,如:
static int MAX = 10;
这样的变量,即为静态的全局变量,通常定义在”头文件”中。static 修饰时,不能再有 extern 同时修饰。
extern与全局变量、局部变量
默认情况下
一个函数不可以访问在它后面定义的全局变量,若要使它可以访问,则需要在函数外声明并加上extern,如:
|
|
声明在函数外的变量,默认就是全局的,extern可以省略。
多次声明同一个全局变量
这种情况下,不会报错,只表示一个变量。 即使在多个源文件中声明的同名的全局变量,也都代表着同一个变量。
前面说过,extern可以省略,都是表示全局变量。
但,如下情况是会报错的:
123456789//file: test.hextern int MAX;//file: main.cextern int MAX;main {MAX = 10;}如下这样使用,也是有问题的:
123456789//file: test.hint MAX;//file: main.cextern int MAX;main {MAX = 10;}还有,两个文件中都定义成
int MAX
, 也不行。那么除去上面三种情况,只有一种是正确的:test.h 定义成
extern int MAX;
在main.c中int MAX
- extern 修饰的全局变量,不建议直接声明时初始化
- 使用extern 声明后,需要再 『定义』一次,即不使用extern 进行定义。这时会分配内存空间,且可以进行初始化
- 多个文件中都存在同一个全局变量时:在要使用的地方,需要使用 『定义』式,以分配空间。
在局部变量前 加extern
12345int y = 10; //这样声明并初始化是可以的, 但加上extern后,xcode报了警告,不影响运行void test() {// int y = 11; //这是局部变量extern int y = 12; //这是全局变量}同名的局部变量和全局变量,是不能在同一个函数内,同时出现的。
函数
内部函数
static 修饰的函数为内部函数,该函数就只能在其定义所在的文件中使用。
|
|
定义在前面的函数,可以访问定义在后面的所有函数
外部函数
extern 修饰的函数为外部函数。一般省略该关键字,即默认就是外部函数
|
|
通常在头文件中,定义好外部函数;在源文件中进行实现。
要引用其它外部函数时,只需要引入其所在的头文件: #include "inner.h"
若,当前源文件中的函数 与 引用的外部函数 同名,且参数个数与类型一致,会报错。