C 语言存储类
提示
- 存储类的基本概念:C语言中的每个变量都有类型和存储类,其中存储类决定了变量的作用域、可见性和生命周期,包括自动(automatic)、外部(external)、静态(static)和寄存器(register)四种类型。
- 局部变量和全局变量:在一个块内声明的变量称为局部变量,它们仅在该块中存在;而在所有函数外声明的变量称为全局变量,它们在程序的任何函数中都是可访问的。
- 静态变量和寄存器变量:用
static
关键字声明的静态变量其值在程序执行期间持续存在;用register
关键字声明的寄存器变量旨在优化速度,但现代编译器的代码优化使其很少使用。
C编程中的每个变量都有两个属性:类型和存储类别。
类型指的是变量的数据类型。存储类别决定了变量的作用域、可见性和生命周期。
有4种类型的存储类别:
- 自动(automatic)
- 外部(external)
- 静态(static)
- 寄存器(register)
局部变量
在代码块内声明的变量是自动或局部变量。局部变量只存在于声明它的代码块内。
让我们看一个例子。
#include <stdio.h>
int main(void) {
for (int i = 0; i < 5; ++i) {
printf("C编程");
}
// 错误:此处i未声明
printf("%d", i);
return 0;
}
当你运行上面的程序时,会得到一个未声明标识符i的错误。这是因为i是在for
循环代码块内声明的。在这个代码块之外,它是未声明的。
让我们再看一个例子。
int main() {
int n1; // n1是main()的局部变量
}
void func() {
int n2; // n2是func()的局部变量
}
在上面的例子中,n1是main()
的局部变量,而n2是func()
的局部变量。
这意味着你不能在func()
内访问n1变量,因为它只存在于main()
内。同样,你不能在main()
内访问n2变量,因为它只存在于func()
内。
全局变量
在所有函数之外声明的变量被称为外部或全局变量。它们可以在程序中的任何函数内被访问。
示例1:全局变量
#include <stdio.h>
void display();
int n = 5; // 全局变量
int main()
{
++n;
display();
return 0;
}
void display()
{
++n;
printf("n = %d", n);
}
输出
n = 7
假设,在file1
中声明了一个全局变量。如果你试图在不同的文件file2
中使用该变量,编译器会报错。为了解决这个问题,在file2
中使用关键字extern
来指示外部变量在另一个文件中被声明。
寄存器变量
关键字register
用于声明寄存器变量。寄存器变量被认为比局部变量更快。
然而,现代编译器在代码优化方面非常出色,使用寄存器变量加快程序速度的机会很少。
除非你在嵌入式系统上工作,知道如何为给定应用优化代码,否则使用寄存器变量没有用处。
静态变量
静态变量是使用static
关键字声明的。例如;
static int i;
静态变量的值直到程序结束时才会消失。
示例2:静态变量
#include <stdio.h>
void display();
int main()
{
display();
display();
}
void display()
{
static int c = 1;
c += 5;
printf("%d ",c);
}
输出
6 11
在第一次函数调用期间,c的值初始化为1。它的值增加了5。现在,c的值是6,打印在屏幕上。
在第二次函数调用期间,c不再初始化为1。这是因为c是静态变量。c的值增加了5。现在,它的值将是11,打印在屏幕上。