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

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

C | 存储类和类型限定符 | 问题12

在 C 语言中,存储类和类型限定符用于描述变量的存储位置、作用域和生命周期等属性。

存储类

C 语言提供了 4 种存储类:auto、register、static 和 extern。

  • auto 存储类:当一个变量被定义为 auto 类型时,它的生命周期为所在函数的生命周期。auto 存储类是默认的存储类,可以省略。

  • register 存储类:当一个变量被定义为 register 类型时,它会尽可能地存储在 CPU 的寄存器中,以提高访问速度。

  • static 存储类:当一个变量被定义为 static 类型时,它的生命周期为整个程序的生命周期。它的作用域只限于定义它的文件内部。如果在函数内部使用 static 关键字定义一个局部变量,它的值会在函数调用结束后保持不变。

  • extern 存储类:当一个变量被定义为 extern 类型时,它的作用域为整个程序的生命周期。它的存储位置并不是在定义它的文件中,而是在其他文件中。在定义 extern 变量时并不会分配存储空间,而是表示该变量是在其他文件中已经定义过的。

类型限定符

C 语言提供了两种类型限定符:const 和 volatile。

  • const 类型限定符:当一个变量被定义为 const 类型时,它的值不能被修改。常常用于修饰函数参数,防止函数在内部修改参数的值。

  • volatile 类型限定符:当一个变量被定义为 volatile 类型时,它的值可能随时被修改。常常用于修饰硬件设备的相关变量,保证它们的值能够及时更新。

以下是一些例子:

// auto 存储类的使用
int main() {
    auto int i = 10;  // 等价于 int i = 10;

    return 0;
}

// register 存储类的使用
int main() {
    register int i = 10;

    return 0;
}

// static 存储类的使用
int counter() {
    static int i = 0;
    i++;
    return i;
}

int main() {
    printf("%d\n", counter());  // 输出 1
    printf("%d\n", counter());  // 输出 2
    printf("%d\n", counter());  // 输出 3

    return 0;
}

// extern 存储类的使用
// 在其他文件中定义 global_variable
extern int global_variable;

int main() {
    printf("%d\n", global_variable);

    return 0;
}

// const 类型限定符的使用
int sum(const int a, const int b) {
    // a = 2; 错误,不能修改 a 的值
    // b = 3; 错误,不能修改 b 的值
    return a + b;
}

// volatile 类型限定符的使用
volatile int* addr = (volatile int*) 0x12345678;

int main() {
    int val = *addr;  // 从硬件地址读取值
    *addr = 0x56789ABC;  // 修改硬件地址中的值
    return 0;
}