精华内容
下载资源
问答
  • 变量的存储类型

    2014-11-04 09:26:17
    变量的存储类型有两种:dongtai

    变量的存储类型有两种:动态和静态,其中又有四种基本类型:auto,static,register,extern

    auto便是经常在函数中碰到的那些局部变量,关键字auto可省略,定义register变量就是为了提高对数据的存取速度,只有局部自动变量或形参可以这么定义,下面就static和extern做一个比较:

    1.static是对变量或函数的定义,而extern仅是对变量的声明,也就是在具体使用是需先给出定义;

    2.static定义的变量是永远是在全局数据区分配内存,而extern由于是对变量的声明,并不分配内存空间;

    3.static定义的全局变量没有初始化,默认为0 or 空字符;

    4.static的作用域对于静态全局变量或函数是本.c文件内从定义开始到该文件结束,对于静态局部变量是函数语句块结束,而extern声明的变量可以跨函数,跨文件使用;

    5.static定义的静态函数只能在本.c文件中使用,extern声明的函数可以跨模块使用。


    说一下需要使用static或extern的地方(个人在编程中遇到的):

    1.需要保留函数上一次调用结束的值时,可使用static,注意,只有本函数才能引用,其余函数不行,类似的例子参考阶乘,递归子类的算法;

    2.静态变量是在函数调用之前赋值的(自动变量是在函数调用时赋值,so,每调用一次就要重新赋一次值,而静态变量是在编译时进行),若该变量只被引用而不改变值得话,可以考虑使用静态变量;

    3.在工程中,若需要使用跨文件的全局变量,可以考虑声明extern变量,个人觉得这是extern唯一值得也是实际中可以使用的地方(PS:extern跨文件的原理,编译时遇到extern,先在本文件中找外部变量的定义,如果找到,就在本文件中扩展作用域,如果找不到,就从其他文件中找外部变量的定义,如果在其它文件中找到了,就将作用域扩展到本文件,否则,error)


    static定义的变量占内存,会使程序更加凌乱,extern也可能会改变一个全局变量的值,影响另一文件中的执行结果,所以,使用时请慎重。


    下面是为了简单地验证extern的使用,用win console app写的一个小工程:




    可以看出extern的使用方法与技巧。

    展开全文
  • C语言中变量的存储类型

    千次阅读 2018-10-13 12:48:00
    在C语言中,对变量的存储类型说明有以下四种: auto 自动变量register 寄存器变量extern 外部变量static 静态变量 自动变量和寄存器变量属于动态存储方式,外部变量和静态变量属于静态存储方式。 在介绍了...

    在C语言中,对变量的存储类型说明有以下四种:

    auto     自动变量
    register     寄存器变量
    extern    外部变量
    static      静态变量

     

    自动变量和寄存器变量属于动态存储方式,外部变量和静态变量属于静态存储方式。

    在介绍了变量的存储类型之后,可以知道对一个变量的说明不仅应说明其数据类型,还应说明其存储类型

    因此变量说明的完整形式应为:存储类型说明符数据类型说明符变量名,变量名…;例如:
      static int a,b;               说明a,b为静态类型变量
      auto char c1,c2;         说明c1,c2为自动字符变量
      static int a[5]={1,2,3,4,5};          说明a为静整型数组
      extern int x,y;             说明x,y为外部整型变量

    下面分别介绍以上四种存储类型:
    一、自动变量的类型说明符为auto(缺省的符号,不写就是默认auto)
      这种存储类型是C语言程序中使用最广泛的一种类型。C语言规定,函数内凡未加存储类型说明的变量均视为自动变量,也就是说自动变量可省去说明符auto。

      自动变量的作用域仅限于定义该变量的个体内。在函数中定义的自动变量,只在该函数内有效。在复合语句中定义的自动变量只在该复合语句中有效。

      自动变量属于动态存储方式,只有在使用它,即定义该变量的函数被调用时才给它分配存储单元,开始它的生存期。函数调用结束,释放存储单元,结束生存期。因此函数调用结束之后,自动变量的值不能保留。在复合语句中定义的自动变量,在退出复合语句后也不能再使用,否则将引起错误。

      由于自动变量的作用域和生存期都局限于定义它的个体内(函数或复合语句内),因此不同的个体中允许使用同名的变量而不会混淆。即使在函数内定义的自动变量也可与该函数内部的复合语句中定义的自动变量同名。

     

    二、外部变量的类型说明符为extern

      1.外部变量和全局变量是对同一类变量的两种不同角度的提法。全局变量是从它的作用域提出的,外部变量从它的存储方式提出的,表示了它的生存期。
      2.当一个源程序由若干个源文件组成时,在一个源文件中定义的外部变量在其它的源文件中也有效。

     

    三、静态变量static

      1、静态局部变量

        静态局部变量属于静态存储方式,它具有以下特点:
        (1)静态局部变量在函数内定义,但不象自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。
        (2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后,尽管该变量还继续存在,但不能使用它。
        (3)允许对构造类静态局部量赋初值。在数组一章中,介绍数组初始化时已作过说明。若未赋以初值,则由系统自动赋以0值。
        (4)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。根据静态局部变量的特点,可以看出它是一种生存期为整个源程序的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。

     

      2、静态全局变量

      全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。因此static这个说明符在不同的地方所起的作用是不同的。应予以注意。

     

    四、寄存器变量register

      上述各类变量都存放在存储器内,因此当对一个变量频繁读写时,必须要反复访问内存储器,从而花费大量的存取时间。为此,C语言提供了另一种变量,即寄存器变量。这种变量存放在CPU的寄存器中,使用时,不需要访问内存,而直接从寄存器中读写,这样可提高效率。寄存器变量的说明符是register。对于循环次数较多的循环控制变量及循环体内反复使用的变量均可定义为寄存器变量。

      1.只有局部自动变量和形式参数才可以定义为寄存器变量。因为寄存器变量属于动态存储方式。凡需要采用静态存储方式的量不能定义为寄存器变量。
      2.在Turbo C,MS C等微机上使用的C语言中,实际上是把寄存器变量当成自动变量处理的。因此速度并不能提高。而在程序中允许使用寄存器变量只是为了与标准C保持一致。3.即使能真正使用寄存器变量的机器,由于CPU中寄存器的个数是有限的,因此使用寄存器变量的个数也是有限的。

    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    参考链接:

    C语言变量的存储类型:https://www.2cto.com/kf/201607/523634.html

    深入探讨C语言中局部变量与全局变量的作用域与存储类别: https://www.cnblogs.com/linuxAndMcu/p/8324497.html

    转载于:https://www.cnblogs.com/grooovvve/p/9782550.html

    展开全文
  • 全局变量的存储类型

    千次阅读 2017-07-16 17:41:54
    全局变量的存储类型 在函数外部定义的变量是全局变量,它的作用域是从变量的定义点开始,到本程序文件的末尾。全局变量分为两种:1.extern声明的变量 2.static声明的变量。 当未对全局变量指定存储类别时,隐含为...

    全局变量的存储类型
    在函数外部定义的变量是全局变量,它的作用域是从变量的定义点开始,到本程序文件的末尾。全局变量分为两种:1.extern声明的变量 2.static声明的变量。 当未对全局变量指定存储类别时,隐含为extern类别。用extern和static声明的全局变量都是静态存储方式(存放在静态存储区),都是在编译时分配内存的。


    1.extern声明的全局变量
    用extern声明的全局变量,可以扩展到全局变量的作用域。如果全局变量不是在文件的开头定义,其有效作用范围时从变量的定义点到程序文件的结束。如果在定义 点之前的函数想用该全局变量,则应该再引用之前用关键字extern对该变量做“外部变量声明”,表示该变量是一个已经定义的全局变量。这样就可以从声明处起合法的使用该全局变量。例:

    #include <stdio.h>
        void fun(void)
        {
            extern int x,y;
            Int a= 15,b=10;
            x += a + b;
            y += a - b;
        }
        int x,y;
        void main(void)
        {
            Int a= 8,b=5;
            x = a + b;
            y = a - b;
            fun();
            printf("%d,%d",x,y);
        }
    
        result:   38,8
    
    如果在一个程序包含两个文件,在两个文件中都要用到同一个全局变量Flag,不能分别在两个文件中各自定义一个全局变量Flag,否则在进行程序连接时会出现“重复定义”的错误。正确的做法是:在任意一个文件中定义全局变量Flag,而在另一个文件中通过语句“extern Flag;”来声明。这样就可以正常使用了。
    
    1. static声明的全局变量
      当程序设计时某些全局变量只限于被本文件使用,而不能被其他文件使用,这是就可以在定义全局变量时加static声明。
    #include <stdio,h>
        static int A;
        void fun(void)
        {
            …………
        }
    展开全文
  • C语言变量的存储类型

    2016-12-25 21:30:00
    变量的存储类型“这些都是用来修饰变量的,修饰函数的时候,其可能有不同的含义,请加以区分,后面会针对修饰函数来进行总结” 存储类型 变量 说明 auto 自动变量 局部变量在缺省的情况下会归为自动变量,默认...

    变量的存储类型

    “这些都是用来修饰变量的,修饰函数的时候,其可能有不同的含义,请加以区分,后面会针对修饰函数来进行总结”

    存储类型 变量 说明
    auto 自动变量 局部变量在缺省的情况下会归为自动变量,默认是不会进行初始化,会产生随机值
    static 静态变量 在程序执行的时候存在,并且只要整个程序在运行,就可以继续访问该变量,默认是会进行初始化,并且只有一次
    extern 外部变量(全局变量) 作用领域是整个程序,包括该程序的各个文件,生存周期非常长,它在该程序运行结束后,才开始释放内存,默认是会初始化并且初始化一次
    register 寄存器变量 存放在Cpu的寄存器当中,对于循环次数较多的循环控制变量以及循环体内部反复使用的变量可定义为及存取变量,只能是局部变量不能是全局变量,并且不能加static进行修饰,默认是不会进行初始化的

    区分:
    auto对局部变量的时候缺省会归类为自动变量,默认是不会进行初始化的,
    static 生命周期是整个程序。默认是会初始化的
    extern 如果为全局变量,缺省是默认归类为全局变量,默认会初始化的
    register寄存器变量,不一定会申请成功。

    如果想要深入的了解其中的原理的话,那我们必须首先来理解一下Linux下,内存管理部分的原理:

    auto局部变量存储的地方是栈——–>不会初始化,栈的调用是循环利用的,有可能其中存储的是以前存储类型的数据。
    而static和extern所存储的区域为数据段——–>会初始化
    register不能定义成全局和静态的时候,说明他们存储的位置是不允许放入静态存储区域中的,生命周期仅仅局限在函数内部

    如下图所示:Linux的内存分配:
    这里写图片描述

    下面我们来通过一个事例来看一下这写变量的存储类型:

    #include<stdio.h>
    #include<stdlib.h>
    
    int global_variable_num;//全局变量,初始化为0,生命周期为软件运行周期
    static int static_global_variable_num;//静态全局变量,初始化为0,生命周期软件运行
    int *gloable_pointer;//全局指针变量,初始化为NULL,
    
    void func();
    int main(void){
        printf("global_variable_num:%d\n",global_variable_num);
        printf("static_global_variable_num:%d\n",static_global_variable_num);
        printf("*gloable_pointer:%p\n",gloable_pointer);
    
        global_variable_num++;
        static_global_variable_num++;
    
        /**调用三次func函数,系统会每次都会为函数分配一次函数栈空间,第一次运行完之后,栈空间会被释放,然后第二次运行的时候,系统会再次分配,而第二>次分配的空间与第一次的不一定属于一个空间。以此类推*/
        func();
        func();
        func();
    
    
        return 0;
    }
    
    void func(){
        int patical_variable;//局部变量,默认是不会初始化的,系统会自动将其归类为自动变量
        auto int auto_patical_variable;//局部自动变量,不会初始化
        static  static_patical_variable;//静态局部变量。系统会初始化一次,并且其生命周期是整个软件的周期,存储在数据段中的静态存储区域
        printf("global_variable_num:%d,static_global_variable_num:%d\n",global_variable_num,static_global_variable_num);
        printf("patical_variable:%d,auto_patical_variable:%d,static_global_variable_num:%d\n",patical_variable,auto_patical_variable,static_global_variable_num);
    
        register int register_variable = 10;//寄存器变量。寄存器变量,寄存器变量生命周期属于函数内部。
        register_variable++;
        printf("register_variable:%d\n",register_variable);
    
        static_global_variable_num++;
        printf("static_global_variable_num:%d\n",static_global_variable_num);
    }

    输出结果为 :
    global_variable_num:0
    static_global_variable_num:0
    *gloable_pointer:(nil)
    global_variable_num:1,static_global_variable_num:1
    patical_variable:158690944,auto_patical_variable:32671,static_global_variable_num:1
    register_variable:11
    static_global_variable_num:2
    global_variable_num:1,static_global_variable_num:2
    patical_variable:158690944,auto_patical_variable:32671,static_global_variable_num:2
    register_variable:11
    static_global_variable_num:3
    global_variable_num:1,static_global_variable_num:3
    patical_variable:158690944,auto_patical_variable:32671,static_global_variable_num:3
    register_variable:11
    static_global_variable_num:4

    以上结果可以看出来整个变量存储类型的分配和作用域,具体结果分析不在赘述,在代码块中已经详细进行讲解,谢谢

    展开全文
  • 对于变量的存储类型,前面遇到过一些疑惑,再简单的在这里说一下。存储类型是指存储变量值的内存类型,它用来决定存储空间的大小。变量的存储类型决定着变量的存储器和作用域。有三个地方可以用于存储变量:普通内存...
  • C 变量的存储类型

    千次阅读 2012-01-11 12:44:00
    变量的存储类型规定了该变量所在内存中的存储区域,因而规定了该变量作用时间的长短,这种性质又称为“存在性”。变量在程序中声明的位置决定了该变量的作用域,即在什么范围内可以引用该变量,“可引
  • 静态存储方式:是指在程序运行期间分配固定的存储空间的方式。动态存储方式:是在程序运行期间根据按需分配进行动态的分配存储空间方式。用户存储空间可以分为程序区、静态存储区、动态存储区。全局变量全部存放在...
  • C++变量的存储类型

    2018-02-18 16:41:20
      存储类型是从变量的存在时间来划分变量,可分为静态存储方式和静态存储方式。对于动态存储变量,当程序运行到该变量处时才为其分配存储空间,当程序运行到该变量所在作用域的结束处时自动收回为其分配的存储空间...
  • 内容来源:C和指针(第二版),人民邮电出版社。...默认存储类型变量声明位置有关:像全局变量这样代码块之外声明的变量存储在静态内存中,不在堆栈里,程序执行期间始终存在;代码块内声明的变量默认存储类型是...
  • c语言变量的存储类型

    千次阅读 2009-09-21 22:02:00
    c语言变量的存储类型可分为:永久性和临时性两种。永久性变量的关键字是:extern和static两个,临时性的为:auto和register extern:默认情况下全局变量和全局函数的存储类型是extern,能够被定义之后同一个编译单元...
  • C语言中,变量的存储类型有几种?

    千次阅读 2016-04-04 17:40:10
    在C语言中,对变量的存储类型说明有以下四种:  auto 自动变量  register 寄存器变量  extern 外部变量  static 静态变量  所谓存储类型是指变量占用内存空间的方式,也称为存储方式。变量的存储方式可分为...
  • 下面是四种存储类型: auto存储型:一般是为自动分配内存空间,局部变量以及形参或是一些实参变量。 static存储型:修饰是静态变量,分为静态局部变量以及动态局部变量。 首先静态局部变量如代码: #include<...
  • C语言中,各种变量的存储类型介绍
  • 从内存理解c语言中变量的存储类型

    千次阅读 2012-10-14 10:46:34
    今晚看了一下linux程序设计,看到了进程管理这一块,讲解了c语言中的各种变量的存储类型,而且是从进程、内存的角度讲解的,以前从没有这样理解过,觉得挺有用的,在这里记录下来。 首先要来理解一下可执行文件...
  • 常量样子和变量完全一样,只是它们值不能被修改,可以使用const关键字来声明常量。 int const max_eleemnts = 50; max_eleemnts 是一个值不能被修改的变量 所以数组长度不可以使用 但是此时可以用 #define...
  • 这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 43,980
精华内容 17,592
关键字:

变量的存储类型