📅  最后修改于: 2023-12-03 15:29:43.791000             🧑  作者: Mango
在 C 语言中,存储类定义了变量或函数的作用域、存储方式和生命周期等特性。C 语言中提供了以下四种存储类:
auto
存储类是默认的存储类。在 C 语言中,所有的局部变量都使用 auto
存储类,这意味着它们的生命周期与所在的代码块相同。
{
int a = 10; // 使用 auto 存储类声明变量 a
printf("%d", a);
} // a 的生命周期结束
static
存储类被用于限制变量的生命周期和作用域。使用 static
存储类声明的变量只会被初始化一次,而且它们的值在函数调用之间得以保留。
void func()
{
static int count = 0; // 使用 static 存储类声明变量 count
count++;
printf("%d\n", count);
}
int main()
{
func(); // 输出 1
func(); // 输出 2
func(); // 输出 3
return 0;
}
extern
存储类被用于提供一个全局变量的声明,表示该变量是在其他文件中定义的。
file1.c
:
#include <stdio.h>
int count = 0; // 定义一个全局变量 count
void func()
{
extern int count; // 使用 extern 存储类声明变量 count
count++;
printf("%d\n", count);
}
int main()
{
func(); // 输出 1
func(); // 输出 2
func(); // 输出 3
return 0;
}
file2.c
:
extern int count; // 声明变量 count
int main()
{
count = 10; // 在其他文件中定义变量 count
return 0;
}
register
存储类声明变量应该存储在 CPU 寄存器中,而不是 RAM 中,这意味着变量的访问速度将非常快,但是变量的大小必须小于或等于寄存器的大小。
void func()
{
register int count = 0; // 使用 register 存储类声明变量 count
for (int i = 0; i < 10000000; i++) {
count++;
}
printf("%d\n", count);
}
int main()
{
func();
return 0;
}
在 C 语言中,类型限定符用于修改基本数据类型的含义,例如增加或删除 const
、volatile
或 restrict
限定符。
const
类型限定符用于声明一个变量为只读的。一旦声明了 const
变量,就不能再修改它的值。
const int a = 10; // 声明一个 const 变量 a
a = 20; // 这里会报错
volatile
类型限定符用于声明一个变量为易变的。如果一个变量是易变的,意味着它的值可能被一个未知的因素所改变,因此编译器不会对其进行优化。
volatile int a = 10; // 声明一个 volatile 变量 a
restrict
类型限定符用于告诉编译器,某个指针是该指针访问数据的唯一途径。这有助于编译器生成更高效的代码。
void func(int * restrict p1, int * restrict p2)
{
*p1 += 10; // 这里编译器可以进行优化
*p2 += 20; // 这里编译器可以进行优化
}
int main()
{
int a = 10, b = 20;
func(&a, &b);
return 0;
}