1-4 C语言 - 存储类别关键字及其使用(超详细)

本节重点讲述存储类别关键字及其使用,如果想详细了解关键字的同学点击下方链接进行跳转

1-1 C语言 - 关键字及其使用(数据类型)-CSDN博客

1-2 C语言 - 控制语句关键字-CSDN博客

1-3 C语言 - 控制语句的使用注意事项(这些绝对是您经常出错的地方)-CSDN博客

目录

1. auto:自动变量

2. register:寄存器变量

3. static:静态变量

4. extern:外部变量

5. 代码示例


1. auto:自动变量

auto 是C语言中的默认存储类,用于局部变量。其生命周期是从定义开始到所在块结束,作用域仅限于定义它的块内部。

  • 概述auto 关键字用于声明自动变量,默认情况下,所有局部变量都是自动变量。
  • 特性
    • 作用域:局部,即声明它们的函数或块。
    • 存储周期:自动,函数或块结束时自动销毁。
    • 默认值:未初始化时,值是未定义的。
    • 关键点:通常不显式使用 auto 关键字,因为它是局部变量的默认存储类别。
void function() {
    auto int a = 5;  // 等同于 int a = 5;
}

2. register:寄存器变量

register 提示编译器尽量将变量存储在CPU寄存器中,以提高访问速度。并不是所有变量都能存储在寄存器中,这取决于硬件和编译器的实现。通常只能对少量局部变量使用 register

  • 概述register 关键字提示编译器将变量存储在 CPU 的寄存器中,而不是内存中,以提高访问速度。
  • 特性
    • 作用域:局部。
    • 存储周期:自动。
    • 默认值:未初始化时,值是未定义的。
    • 关键点
      • 编译器可能会忽略 register 提示,具体实现取决于编译器。
      • 寄存器变量不能取地址,即不能使用 & 运算符。
void function() {
    register int count = 0;
    for (count = 0; count < 100; count++) {
        // 快速访问 count
    }
}

3. static:静态变量

static 关键字用于定义静态局部变量、静态全局变量和静态函数。静态局部变量的生命周期是整个程序运行期间,但作用域仅限于定义它的块内部;静态全局变量和静态函数只能在定义它们的文件中可见。

  • 概述static 关键字用于声明静态变量,具有持久存储周期,即在整个程序执行期间保留其值。

  • 特性

    • 局部静态变量
      • 作用域:局部,但其值在函数调用之间保持不变。
      • 存储周期:静态,即整个程序运行期间。
      • 默认值:未显式初始化时,默认初始化为零。
    void function() {
        static int count = 0;  // 初始化只进行一次
        count++;
        printf("%d\n", count);  // 每次调用函数,count 都会累加
    }
    
    • 全局静态变量
      • 作用域:当前文件。
      • 存储周期:静态。
      • 默认值:未显式初始化时,默认初始化为零。
      • 关键点:限制变量的作用域,仅在定义它的文件中可见,避免命名冲突。
static int Count = 0;  // 仅在当前文件中可见

4. extern:外部变量

extern 用于声明一个在其他文件中定义的全局变量或函数,使其可以在本文件中使用。extern 本身不定义变量,只是引用外部定义的变量。

  • 概述extern 关键字用于声明外部变量,即在其他文件中定义的全局变量。
  • 特性
    • 作用域:全局,但实际定义在其他文件。
    • 存储周期:静态。
    • 默认值:由实际定义的文件中的初始值决定。
    • 关键点:用于跨文件共享变量。
// 在 file1.c 中定义全局变量
int count = 10;

// 在 file2.c 中引用全局变量
extern int count;

void function() {
    printf("%d\n", count);  // 使用 file1.c 中定义的 count
}

5. 代码示例

#include <stdio.h>

// `extern` 关键字的示例
extern int globalVar= 0; // 全局变量的声明

// 函数声明
void func1();
void func2();
void staticExample();

int main() {
    // `auto` 关键字的示例
    auto int autoVar = 1; // 自动变量(局部变量)
    printf("Value of autoVar in main: %d\n", autoVar);
    
    // 调用函数
    func1();
    func2();
    
    // 调用 static 变量示例函数
    staticExample();
    staticExample();
    
    return 0;
}

// 函数1
void func1() {
    // `register` 关键字的示例
    register int regVar = 2; // 寄存器变量
    printf("Value of regVar in func1: %d\n", regVar);
    
    // 修改并输出全局变量
    globalVar = 5;
    printf("Value of globalVar in func1: %d\n", globalVar);
}

// 函数2
void function2() {
    // 局部变量
    int localVar = 3;
    printf("Value of localVar in func2: %d\n", localVar);
    
    // 输出全局变量
    printf("Value of globalVar in func2: %d\n", globalVar);
}

// static 变量示例函数
void staticExample() {
    static int staticVar = 0; // 静态局部变量
    staticVar++;
    printf("Value of staticVar in staticExample: %d\n", staticVar);
}

  • 19
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值