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

📅  最后修改于: 2023-12-03 14:39:40.384000             🧑  作者: Mango

存储类和类型限定符

在 C 语言中,存储类和类型限定符用于指定标识符(变量、函数等)的内存分配方式、作用域和初始化规则等信息。本文将介绍 C 语言中常用的存储类和类型限定符。

存储类

存储类用于指定标识符的内存分配方式和作用域。C 语言中有 4 种存储类:

  • 自动存储类(auto)
  • 静态存储类(static)
  • 寄存器存储类(register)
  • 外部存储类(extern)
自动存储类

自动存储类是默认的存储类,当没有显示使用其他存储类时,标识符被视为具有自动存储类。自动存储类指的是标识符在函数内部被声明时,存储在栈上,函数退出时自动销毁。

void func(){
    auto int a;    // auto可以省略不写
}
静态存储类

静态存储类指的是标识符在程序执行期间始终存在,并且只有一份拷贝。静态存储类可以用于具有长期存在需求的标识符。静态存储类有两种:

  • 静态局部变量(static)
  • 静态全局变量(static extern)

静态局部变量是在函数内部声明的静态变量,与自动变量不同的是,静态局部变量只会在函数被调用时被初始化一次,并且在下一次调用时仍使用上一次的值。

void func(){
    static int a = 0;   // 只会初始化一次
    a++;
}

静态全局变量是全局变量,在其前面加上 static 关键字即可。静态全局变量在程序开始执行时被初始化,与普通全局变量不同的是,静态全局变量的作用域被限制在定义它的文件内部。

// 在其他文件中无法访问
static int a = 0;
寄存器存储类

寄存器存储类用于声明寄存器变量,这种变量被存储在 CPU 的寄存器中,访问速度快,但是寄存器数量有限,并且无法取地址。

void func(){
    register int a = 0;   // 可以被编译器放到寄存器中
}
外部存储类

外部存储类用于声明在函数外部定义的变量。外部变量拥有全局作用域,可以在文件中的任何位置访问它们。

extern int a;   // 在其他文件中定义的全局变量
类型限定符

类型限定符用于说明声明的标识符具有的属性和限制。C 语言中有 2 种类型限定符:

  • const
  • volatile
const

const 用于指定标识符的值不会被修改。对于 const 修饰的变量,一旦被初始化,它的值就无法再被修改。const 还可以用于函数参数,这样可以防止函数在执行过程中修改参数的值。

const int a = 0;    // 常量
void func(const int a){    // 参数也是常量
    // ...
}
volatile

volatile 用于指定标识符的值可能会被意想不到的方式修改。通常情况下,编译器为了代码优化的目的,会在不提醒用户的情况下缓存变量的值,这可能导致程序出错。使用 volatile 修饰的变量则不会被缓存,即使它没有被修改,编译器也会重新读取它的值。

volatile int a;   // 变量可能会被意外修改