零基础C语言:第十三讲(生存期、存储类型)

233 阅读2分钟

「这是我参与2022首次更文挑战的第13天,活动详情查看:2022首次更文挑战

生存期

  • 生存期

    • C语言的变量拥有两种生存期

      • 静态存储期
      • 自动存储期
    • 具有文件作用域的变量属于静态存储期(全局变量和函数),函数也属于静态存储期。属于静态存储期的变量在程序执行期间将一直占据存储空间,直到程序关闭才释放。
    • 具有代码块作用域的变量一般情况下属于自动存储期。属于自动存储期的变量在代码块结束时将自动释放存储空间。

存储类型

  • 存储类型

    • 存储类型其实是指存储变量值的内存类型,C语言提供了5中不同的存储类型;

      • auto(自动变量)

        • 在代码块中声明的变量默认的存储类型就是自动变量(自动存储期),使用关键字auto来描述。
        • 由于这是默认的存储类型,所以不写auto是完全没问题的。
        • auto int a;等价int a;
      • register(寄存器变量)(注:寄存器存在于cpu内部)

        • 将一个变量声明为寄存器变量,那么该变量就有可能被存放在cpu的寄存器中。(为什么是有可能,因为cpu的寄存器空间十分有限,编译器不可能让你为所欲为,编译器有一套自己的优化方法)
        • 寄存器变量和自动变量在很多方面是一样的,它们都拥有代码块作用域,自动存储期和空链接属性。
        • 不过这里有一点需要注意的是:当你将变量声明为寄存器变量,那么你就没办法通过取址运算符获得该变量的地址。(因为cpu寄存器的地址默认是不允许获取的,如果这样做会报错)

          • 举例(访问寄存器地址直接报错)
      • static

        • 使用static来声明局部变量,那么就可以将局部变量指定为静态局部变量。
        • static使得局部变量具有静态存储期,所以它的生存期和全局变量一样,指导程序结束才释放。
        • 举例(使用static)
        • 结果(使用static)
        • 结果(不使用static)
        • 注:static没有改变作用域
      • extern

        • static和extern

          • 作用于文件作用域的static和extern,static关键字使得默认具有external链接属性的标识符变成internal链接属性,而external关键字是用于告诉编译器这个变量或函数在别的地方已经定义过了,先去别的地方找找,不要着急报错。
          • 总的来说extern和auto也有点类似

            • 举例(不写这两个extern同样没问题)

              • func.c
              • main.c
            • 结果
      • typedef