• 14-变量类型


     一、变量的作用域

    C语言根据变量作用域的不同,将变量分为局部变量和全局变量

    1.局部变量

    1> 定义:在函数内部定义的变量,称为局部变量。形式参数也属于局部变量。

    2> 作用域:局部变量只在定义它的函数内部有效,即局部变量只有在定义它的函数内部使用,其它函数不能使用它。

    2.全局变量

    1> 定义:在所有函数外部定义的变量,称为全局变量。

    2> 作用域:全局变量的作用范围是从定义变量的位置开始到源程序结束,即全局变量可以被在其定义位置之后的其它函数所共享

    复制代码
    1 int a;
    2 
    3 int main ()
    4 {
    5     int b;
    6     return 0;
    7 }
    复制代码

    第1行的变量a是全局变量,第5行的变量b是局部变量。

    二、变量的存储类型

    * 变量的存储类型就是指变量存储在什么地方。有3个地方可以用于存储变量:普通内存、运行时堆栈、硬件寄存器。变量的存储类型决定了变量何时创建、何时销毁以及它的值能保持多久,也就是决定了变量的生命周期。

    * C语言根据变量的存储类型的不同,可以把变量分为:自动变量、静态变量、寄存器变量。

    1.自动变量

    1> 定义:自动变量是存储在堆栈中的。

    2> 哪些是自动变量:被关键字auto修饰的局部变量都是自动变量,但是极少使用这个关键字,基本上是废的,因为所有的局部变量在默认情况下都是自动变量

    3> 生命周期:在程序执行到声明自动变量的代码块(函数)时,自动变量才被创建;当自动变量所在的代码块(函数)执行完毕后,这些自动变量就会自行销毁。如果一个函数被重复调用,这些自动变量每次都会重新创建。

    1 void test(int a, int b) {
    2     int c = a + b;
    3     
    4     auto int d;
    5 }

    第1行的变量a、b,第2行的变量c、第4行的变量d都是自动变量。

    2.静态变量

    1> 定义:静态变量是存储在静态内存中的,也就是不属于堆栈。

    2> 哪些是静态变量:

    • 所有的全局变量都是静态变量
    • 被关键字static修饰的局部变量也是静态变量

    3> 生命周期:静态变量在程序运行之前创建,在程序的整个运行期间始终存在,直到程序结束

    复制代码
     1 #include <stdio.h>
     2 
     3 int a;
     4 
     5 void test() {
     6     static int b = 0;
     7     b++;
     8     
     9     int c = 0;
    10     c++;
    11     
    12     printf("b=%d, c=%d 
    ", b, c);
    13 }
    14 
    15 int main() {
    16     int i;
    17     // 连续调用3次test函数
    18     for (i = 0; i<3; i++) {
    19         test();
    20     }
    21     
    22     return 0;
    23 }
    复制代码

    * 第3行的变量a、第6行的变量b都是静态变量,第9行的变量c、第16行的变量i是自动变量。

    * 因为第6行的变量b是静态变量,所以它只会被创建一次,而且生命周期会延续到程序结束。因为它只会创建一次,所以第6行代码只会执行一次,下次再调用test函数时,变量b的值不会被重新初始化为0。

    * 注意:虽然第6行的变量b是静态变量,但是只改变了它的存储类型(即生命周期),并没有改变它的作用域,变量b还是只能在test函数内部使用。

    * 我们在main函数中重复调用test函数3次,输出结果为:

    3.寄存器变量

    1> 定义:存储在硬件寄存器中的变量,称为寄存器变量。寄存器变量比存储在内存中的变量访问效率更高(默认情况下,自动变量和静态变量都是放在内存中的)

    2> 哪些变量是寄存器变量:

    • 被关键字register修饰的自动变量都是寄存器变量
    • 只有自动变量才可以是寄存器变量,全局变量和静态局部变量不行
    • 寄存器变量只限于int、char和指针类型变量使用

    3> 生命周期:因为寄存器变量本身就是自动变量,所以函数中的寄存器变量在调用该函数时占用寄存器中存放的值,当函数结束时释放寄存器,变量消失。

    4> 使用注意:

    • 由于计算机中寄存器数目有限,不能使用太多的寄存器变量。如果寄存器使用饱和时,程序将寄存器变量自动转换为自动变量处理
    • 为了提高运算速度,一般会将一些频繁使用的自动变量定义为寄存器变量,这样程序尽可能地为它分配寄存器存放,而不用内存
    1 int main() {
    2     register int a;
    3     return 0;
    4 }

    第2行的变量a是个寄存器变量。

  • 相关阅读:
    arcgis api 3.x for js 入门开发系列八聚合效果(附源码下载)
    arcgis api 3.x for js 入门开发系列七图层控制(附源码下载)
    arcgis api 3.x for js 入门开发系列六地图分屏对比(附源码下载)
    arcgis api 3.x for js 入门开发系列五地图态势标绘(附源码下载)
    arcgis api 3.x for js 入门开发系列四地图查询(附源码下载)
    Java里面获取当前服务器的IP地址
    Flutter at Google I/O 2018
    Modbus RTU 协议使用汇总
    plsql 创建表空间、用户、赋予权限
    Oracle:ODP.NET Managed 小试牛刀
  • 原文地址:https://www.cnblogs.com/0zcl/p/6067258.html
Copyright © 2020-2023  润新知