存储类别的概念及存储方式
指变量在内存中的存储方式。
分为:
静态存储方式:指在程序运行期间分配固定的存储空间;
动态存储方式:指在程序运行期间根据需要动态分配存储空间。
存储类型修饰符
在C语言中,提供了4种存储类型修饰符:
auto(自动变量)
概念:
自动存储类型修饰符auto指定了一个局部变量为自动的,每次执行到定义该变量的语句块时,都动态地分配存储空间,即数据存储在动态存储区中。
定义形式:
[ auto ] 数据类型 标识符 变量名1,变量名2...... 变量名n;
我们通俗易懂一点:
{ int c, x, k; char arr; ... }
等价于
{ auto int c, x, k; auto char arr; ... }
自动变量的特点:
一:
其作用域仅限于定义该变量的函数或复合语句内
当函数或符合语句运行结束之后,该变量的生命周期也结束,被销毁,其中的值也不能保留
二:
遵循“作用域小的变量屏蔽作用域大的同名变量”的原则
特点一举例:
特点一举例:
#include <stdio.h> fun(int a, int b, int c) { c = a * b; } int main() { auto int c = 0; fun(2, 3, c); printf("%d\n", c); return 0; }
最终运行结果为: 0
特点二举例:
#include <stdio.h> int ji = 114; int main() { auto int ji = 514; printf("%d\n", ji); return 0; }
最终运行结果为: 514
register(寄存器变量)
了解寄存器变量之前,应该先清楚一下寄存器的概念。
寄存器变量,即把变量存放在CPU中的寄存器中。
而先前的auto变量的值则是存放在内存单元中的。
定义形式:
[ register ] 数据类型 标识符 变量名1,变量名2,...,变量名n;
好理解一点地说:
用register修饰变量可以提高程序运行的速度。
寄存器变量的特点:
一:
CPU中寄存器的数量有限,只能将使用频率高的变量设置为register型。如果没有足够的寄存器来存放指定的变量,或者编译程序认为指定的变量不适合放在寄存器中时,就会被自动设为auto型。
二:
由于寄存器变量是放在寄存器中而不是内存中,因此这种类型的变量没有地址,不能对它进行求地址运算。
三:
寄存器的长度一般与机器的字长(是指计算机能直接处理的二进制数据的位数,它决定了计算机的运算精度。)相同,所以数据类型为float、long、double的变量通常不能定义为register型,只有int、short、char类型的变量可以定义为register型。
值得一提的是:register说明只是对编译程序的一种建议,不是强制的。
static(静态变量)
此类变量存放在静态存储区里。一旦为其分配了存储单元,那么在整个程序运行期间,其占用的存储单元将固定存在,不会被系统释放掉,直到程序运行结束,因此静态变量也称为永久存储变量(或内部变量)。
定义形式:
[ static ] 数据类型 标识符 变量名1,变量名2,...,变量名n;
static可以用来修饰局部变量、全局变量和函数:
一.修饰局部变量
使得局部变量出作用域时不被销毁,改变了局部变量的生命周期(本质上是改变了存储类型,由栈区变为了静态区)。
二.修饰全局变量
使得全局变量只能在自己所在的源文件内部使用。全局变量在其他源文件内部可以使用,是因为其具有外部链接属性,被static修饰后,就变成了内部链接属性。
三.修饰函数
与修饰全局变量相同,本质上都是改变了链接属性。
static修饰局部变量举例
#include <stdio.h> int func() { static int x = 3; return x; } int main() { printf("%d\n",func()); return 0; }
最终运行结果为: 3
static修饰全局变量和函数,一般用于有众多源文件的大型程序,这里不多做举例。
可参考我曾学习和发布的扫雷小项目,其中有用到static修饰自定义函数
extern(外部变量)
概念:
在函数外定义的变量就是外部变量,因此外部变量就是全局变量,它的作用域和生命周期与全局变量完全相同。外部变量和全局变量指的是同一类变量。
但需要明确的是, 全局变量是从作用域的角度提出的,外部变量是从存储方式的角度提出的。
定义形式:
[ entern ] 数据类型 标识符 变量名1,变量名2,...,变量名n;
例如:
y = 5; y_ = 2; t = 1; #include <stdio.h> int main() { extern int y, y_,t; //外部变量的定义 printf("%d%d%d", y, y_, t); return 0; }
最终运行结果为: 521
在 较大型的C程序设计中,一个源程序往往由多个源文件组成,如果一个源文件中定义的全局变量在另外的源文件也要使用到,则需要用extern对该全局变量进行说明。
例如:
test1.c文件中:
int z, n; int main() { ...... }
test2.c文件中:
//该源文件中需要用到上个源文件的两个全局变量 extern int z, n; //故而需要对这两个变量进行声明 int max() { if(z < n) ...... }
暂时就这样
over