📜  C |存储类和类型限定符|问题3(1)

📅  最后修改于: 2023-12-03 15:29:43.768000             🧑  作者: Mango

存储类和类型限定符

存储类

C 语言中的存储类是用来说明变量或函数的存储方式,包括 autoregisterstaticextern,它们有不同的作用和生命周期。

auto

auto 存储类是默认的存储类,定义在函数内的局部变量,会在函数执行时动态地分配存储空间。当函数执行完毕时,这些变量的存储空间会被自动释放。在块级别内定义的 auto 变量的生存周期受到块的限制,它们通常在程序离开块后被释放。

void func() {
    auto int a = 10;
    printf("%d", a);
}
register

register 存储类用于定义存储在寄存器中而不是 RAM 中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常为一个机器字),并且不能对它应用一元的‘&’运算符(因为它没有内存位置)。register 变量的访问速度比其他变量要快。但是,它们的数量很有限,通常只有几个寄存器可用于这个用途。

void func() {
    register int a = 10;
    printf("%d", a);
}
static

static 存储类指示编译器在程序的生命周期内保持局部变量的存在。它们在函数调用之间保持其值,但其作用域限制在定义变量的函数内。静态全局变量在整个程序执行期间都存在,未初始化的静态变量将自动初始化为 NULL(0)。 static 存储类也可用于函数内,指示函数保持其状态。

void func() {
    static int a = 10;
    printf("%d", a);
}
extern

extern 存储类用于提供一个在其他文件中定义的全局变量或函数的引用,变量或函数可以存储在其他的程序文件中。当您使用 'extern' 时,对于程序中的其他所有文件(以及该文件中定义的所有函数),该变量或函数都是可用的。默认情况下,全局变量和函数都与文件的局部变量和函数一起编译。

/* File: a.c */
#include <stdio.h>
int count;
extern void write_extern();

main() {
   count = 5;
   write_extern();
}

/* File: b.c */
#include <stdio.h>
extern int count;
void write_extern(void) {
   printf("count is %d\n", count);
}

以上代码需要a.c和b.c两个文件来编译,a.c中变量count被定义,在b.c中函数write_extern引用了a.c中的count。

类型限定符

C 语言中的类型限定符是用来说明变量或函数的类型的性质,包括 constvolatilerestrict

const

const 限定符用于定义常量,常量的值不能被修改。通常用于定义指针或数组类型。在函数中,const 参数不允许在函数中修改该参数的值。

const int a = 10;    // 定义常数 a 为 10
const char *p = "hello";   // 定义指针 p 指向字符串常量 "hello"
void func(const int a) {
    // 不能修改 a 的值
}
volatile

volatile 限定符告诉编译器该变量的值可能随时修改,防止编译器对该变量的优化。volatile 通常用于多线程编程或与硬件相关的编程。

volatile int a = 10;    // 定义 volatile 变量 a
volatile int *p = &a;   // 定义指针 p 指向变量 a
restrict

restrict 限定符用于通知编译器这个指针是唯一的,没有别的指针或其他别名指针访问它所指向的数据。这可以用来告诉编译器,它可以生成更好的代码。这对于对性能要求严格的计算密集型算法或低级别编程任务非常有用。

int* restrict p = malloc(10 * sizeof(int));    // 定义 restrict 指针

以上是 C 语言中存储类和类型限定符的介绍,了解它们的作用和用法能够帮助我们更好地编写代码。