当我们声明一个变量时,该变量的内存分配和生命周期是由存储类决定的。C语言中的存储类有以下四种类型:
- auto
- register
- static
- extern
自动存储类(auto)
自动存储类是默认的存储类,生命周期仅限于块(block)内。块可以是函数、循环或复合语句等。当在块中定义变量时,它们默认为自动存储类。例如:
#include <stdio.h>
int main()
{
int count = 5;
// auto生命周期仅限于块内
// 在函数内部定义的变量都是自动变量
while(count--)
{
auto int a = 20;
printf("%d\n",a++);
}
return 0;
}
在该程序中,变量a被定义为自动存储类,每次循环迭代时,a的值将被重置为20,因为它的生命周期仅限于while块内。这意味着,每次循环时,a都是一个新的变量。
寄存器存储类(register)
寄存器存储类用于定义应该存储在CPU寄存器中而不是 RAM 中的局部变量。这可以让程序更快地访问变量,因为它们存储在寄存器中,而不是在缓存中或其他类型的内存中。但是,由于现代编译器越来越智能,所以使用register关键字的情况也越来越少。
#include <stdio.h>
int main()
{
register int a;
// 使用register关键字声明变量应存储在CPU寄存器中,而不是RAM中
register char b;
a = 10;
b = 'c';
printf("a的值是:%d\n", a);
printf("b的值是:%c\n", b);
return 0;
}
请注意,使用register修饰符无法直接控制变量存储在哪个寄存器中。这是因为寄存器存储类只是向编译器建议哪些变量应存储在寄存器中。
静态存储类(static)
静态存储类用于定义在块中、函数外的变量,使该变量的生命周期扩展到整个程序执行期间。这意味着,无论函数是否在程序中执行,这个变量始终存在。
#include <stdio.h>
static int count = 10; // 静态变量
void func(){
static int i = 5; // 静态变量
i++;
printf("变量i为 %d ,变量count为 %d\n", i, count);
}
int main(){
while(count--)
{
func();
}
return 0;
}
在该程序中,变量count和变量i都被声明为静态存储类,因此它们的生命周期扩展到程序的执行期间。每次调用函数func()时,变量i的值都会递增1,count的值保持为10。
外部存储类(extern)
外部存储类用于定义在程序外的变量。该变量可以从任何函数访问,通常用于在多个文件中共享相同的变量或函数。
// file1.c
#include <stdio.h>
int count;
extern void write_extern();
int main()
{
count = 5;
write_extern();
return 0;
}
// file2.c
#include <stdio.h>
extern int count;
void write_extern(void)
{
printf("变量count为:%d\n", count);
}
在该程序中,变量count被定义在file1.c中,并通过extern关键字声明为外部变量。然后,在file2.c文件中,我们使用extern关键字将count声明为变量。这允许第二个文件直接访问第一个文件中的变量。最后,我们在main()函数中设置变量count的值,并调用函数write_extern(),以查看变量count的值。