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

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

C - 存储类和类型限定符

存储类

在 C 语言中,存储类定义了变量或函数的作用域、存储方式和生命周期等特性。C 语言中提供了以下四种存储类:

1. auto

auto 存储类是默认的存储类。在 C 语言中,所有的局部变量都使用 auto 存储类,这意味着它们的生命周期与所在的代码块相同。

{
    int a = 10;  // 使用 auto 存储类声明变量 a
    printf("%d", a);
}   // a 的生命周期结束
2. static

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;
}
3. extern

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;
}
4. register

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 语言中,类型限定符用于修改基本数据类型的含义,例如增加或删除 constvolatilerestrict 限定符。

1. const

const 类型限定符用于声明一个变量为只读的。一旦声明了 const 变量,就不能再修改它的值。

const int a = 10;  // 声明一个 const 变量 a
a = 20;  // 这里会报错
2. volatile

volatile 类型限定符用于声明一个变量为易变的。如果一个变量是易变的,意味着它的值可能被一个未知的因素所改变,因此编译器不会对其进行优化。

volatile int a = 10;  // 声明一个 volatile 变量 a
3. restrict

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;
}