精华内容
下载资源
问答
  • c语言变量 变量其实只不过是程序可操作的存储区的名称。C 每个变量都有特定的类型类型决定了变量存储的大小和布局,该范围内的值都可以存储内存,运算符可应用于变量上。 什么是常量,变量你懂了吗? 作者...
  • C语言中变量存储类型和生存周期

    千次阅读 多人点赞 2018-09-06 22:05:30
    数据存储类型:数据内存的存储方式;(这是本博文要讨论的重点) 注意:数据类型和数据存储类型都是针对于声明或定义的函数和变量而言的; 动态存储类型变量或函数,被使用时临时分配内存单元,函数结束...

    前言

    1. 本博文基于VC++6.0开发,调试,运行;
    2. 内容来自谭浩强的《C语言程序设计》总结;

    几个重要概念

    1. 数据类型:浮点型,整型,字符型等都是一个数据类型;
    2. 数据存储类型:数据在内存中的存储方式;(这是本博文要讨论的重点)
      注意:数据类型和数据存储类型都是针对于声明或定义的函数和变量而言的;
    3. 动态存储类型:变量或函数,在被使用时临时分配内存单元,在函数结束后所占用的内存单元将会被释放,例如局部变量;因此,动态存储的变量每次被调用时所占的内存单元的地址可能会发生改变;
    4. 静态存储类型:变量或函数,在程序运行期间编译器统一分配内存单元,直到程序结束分配的内存才被释放;例如:全局变量;

    内存中供用户使用的存储空间

    用户区存储内容
    程序区CPU指令
    静态存储区全部的全局变量,局部静态变量;
    动态存储区被调用函数的形参;被调用函数中非局部静态变量;函数调用时的现场保护和返回地址等

    注:
    1. 在平时编程过程中,一般对变量和函数的声明和定义都应同时指定数据类型和数据存储类型;如果我们没有对变量进行指定数据存储类型;
    2. 在定义全局变量和局部静态变量时,如果没有赋初始值,系统会默认为0;而动态变量们竟会被随机赋值;

    局部变量的存储类型

    1. 自动变量—auto
    定义:函数中,包括复合语句内和形式参数在内的变量中,不被static限制的变量;
    性质:动态存储类型,系统调用函数时临时分配内存单元;函数执行结束就占用的内存释放;

    #include <stdio.h>
    
    int fun1(int a);
    
    void main()
    {
        for(int i=0;i<5;i++)
            printf("%d\n",fun1(5));
    }
    
    int fun1(int a)  //形式参数
    {
        auto int b = 0;    //函数内不被static限制,且函数每次被调用,b的值都会被赋0;
        b++;
        {
            int c;  //函数内复合语句内;
        }
        return b;
    }
    //动态变量没赋初始值情况下初始值为随机的;

    运行结果:
    这里写图片描述
    注:大多数情况下,自动变量是可以直接省略auto的,系统也会默认为自动变量;

    2.静态局部变量—static
    定义:函数内被静态static限制的局部变量;静态局部变量在函数执行结束时,内存不被释放,函数下次被执行的时候,此变量的值并不改变;
    性质:静态存储类型,函数每次被调用其值还是上次函数执行时的值,且默认的初始化的值是0;
    举例:

    #include <stdio.h>
    
    int fun1(int a);
    
    void main()
    {
        for(int i=0;i<5;i++)
            printf("%d\n",fun1(5));
    }
    
    int fun1(int a)
    {
        static int b=a;   //第一次执行函数后被b被赋初值,
                          //以后再执行函数后b将不会再被赋值;
        b--;
        return b;
    }

    输出结果:
    这里写图片描述

    3.寄存器变量—register变量
    定义:存放在CPU寄存器中的变量;(寄存器存储类型也是随着函数的结束,内存被释放)
    形式:register int a = 1; \将定义的a送到寄存器中;
    说明:寄存器这个名词如果是学过单片机的同志肯定是知道的,对于单片机功能的实现,基本上都是靠配置寄存器实现的;寄存器是什么这个问题,我曾经在另外一个博客中详细写到过;
    https://blog.csdn.net/wuyuzun/article/details/74171359
    性质:CPU能够快速读写寄存器变量;
    优点:一般来说,程序中定义,声明的变量是放在内存中的,例如全局变量存储在静态存储器中,对一个全局变量的每次读写操作都是CPU和内存之间的传输;但是寄存器变量是把变量存储在CPU的寄存器中,由于寄存器的读写传输速度很快,所以非常适合处理一些程序中被高频使用的变量;
    缺点:CPU寄存器数量有限,不适合定义太多寄存器变量;
    注意
    1.目前计算器处理速度越来越快,加上C语言IDE对于代码的优化越来越好,所以有时即使我们不去定义或声明一个寄存器变量,IDE也会把高频使用的变量默认声明为寄存器变量;所以在平时的编程时,并不用过于强调寄存器变量;

    全局变量的存储类型

    外部变量:定义在函数外的变量,也可以说就是全局变量;
    全局变量的有效域:自定义处起以下范围;
    举例:

    #include <stdio.h>
    
    void main()    //全局变量a不被main()函数调用;
    {
    }
    
    int a=10;    //全局变量a
    
    void fun1()   //全局变量a可以被fun1()调用;
    {
    
    }

    1.同文件内扩展外部变量的作用域—extern
    举例:

    #include <stdio.h>
    extern int a;   
    void main()    //全局变量a不被main()函数调用;
    {
    }
    int a=10;    //全局变量a
    
    void fun1()   //全局变量a可以被fun1()调用;
    {
    }

    在第二行语句以下的函数都可以调用变量a;外部变量声明也可以写成:”extern a”这种形式,因为a已经是已经定义过的变量;
    注意:extern并不是定义变量,而是声明变量,这个关键字就是为了告诉编译器:本文件中已经定义这个变量;

    2.将外部变量的作用域扩展到其他文件–extern
    怎样扩展:一个大的程序往往是由许多源文件和头文件组成,当不同文件要引用同一个外部变量时,方法是:在任意一个文件中定义外部变量,而在另一个文件中用extern对其进行“外部变量声明”;这样,在编译连接时编译器好知道这个变量来自于其他位置;如果说两个文件同时用了定义了相同名字的外部变量,那编译器连接时会报错;
    扩展的方式:当程序进行编译的时候,编译器遇到extern所声明的变量后,编译器会现在本文件中寻找此变量,如果找到了,就在此处扩展有效域,如果找不到,会进入其他文件进行寻找,找到后将有效域扩展其他文件,如果还找不到就按错误处理;

    3.静态外部(全局)变量–static
    定义:定义在函数外部的静态变量;
    优点:被static限制的外部变量,编译时不会被其他文件发现,即使不同文件之间有同名的现象也没关系;如果确定一个外部变量不被其他文件引用,就可以直接加static,这一点很符合C语言模块化的思想,也提高了程序的可移植性;
    举例:

    #include <stdio.h>
    
    static int a;  //静态全局变量,只能在本文件中被调用;如果在其他文件被调用将会报错;
    void main()
    {
    }

    所以:对于static来说,静态局部变量说明的是此变量的生存期;静态外部变量说明的是此变量的作用域;

    三个概念:
    生存期:一个变量值在某一时刻是存在的,则这个时期就是这个变量的生存期;
    作用域:一个变量在某个文件或函数范围内是有效的,则这个范围就是这个变量的作用域;
    可见性:在一个变量的作用域可以引用该变量,则说这个变量在这个作用域是可见的,这么一个性质就是可见性;

    展开全文
  • 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

    展开全文
  • C语言中变量和基本类型简述

    千次阅读 2018-04-03 19:10:44
    来源:C程序语言设计第四版,谭浩强...一、常量,常变量变量的区别 1、常量: 程序其值不能改变的量: 1)如直接使用的数字1,2.1,12e3(12x10^3),'A',“abc”,1.2E3(1.2x10^(-3)),等,e或E之前必须有 ...
    来源:C程序语言设计第四版,谭浩强
             计算机组成原理,唐朔飞
            计组中,本文最后一道例题,原书中有错。

    一、常量,常变量、变量的区别

        1、常量:

                在程序中其值不能改变的量:

                1)如直接使用的数字1,2.1,12e3(12x10^3),'A',“abc”,1.2E3(1.2x10^(-3)),等,e或E之前必须有

            数字,且e或E后面必须为整数

                2)符号常量:#define  PI  3.1416,特点:对符号常量的名字是不分配存储单元,PI只是临时变量,预

            编译后就不存在这个符号了,符号所在的位置均变为符号常量的值了

                常量就是没有名字的不变量

        2、变量:

            先定义,后使用:

                    如int a = 3;

                    特点:1)有变量名,变量值,有类型,占存储单元

                              2)变量名是一个存储地址,变量值存在存储地址相应的存储单元中,编译之后一直都存在,

                        变量值可以被改变

       3、 常变量:

            C99允许使用常变量:

                    const  int  a=3;

                    特点:1)常变量具有变量的属性,有类型,占存储单元,只是不允许修改值

                              2)常变量就是有名字的不变量,名字便于在程序中被应用

    二、基本数据类型的简述:

            基本类型:

                        整型类型:

                                    基本整型(int)

                                    短整型(short int)

                                    长整型(long int)

                                    双长整型(long long int):C99增加

                                    字符型(char)

                                    布尔型(bool):C99增加

                        浮点类型:

                                    单精度浮点型(float)

                                    双精度浮点型(double)

                                    复数浮点型(float_complex, double_comple, long long_comple)

        1、基本整型(int):

                长度:2/4个字节,由C编译系统决定

                            如:Turbo C2.0,一个int分配2个字节;Visual C++,一个int分配4个字节

                存储方式:1)整数的补码进行存放

                                    正数的补码就是该整数的二进制,负数的补码是其绝对值的二进制取反后加一

                                    如:两个字节存储int 5

                                        原码:00000000 00000101

                                        补码:00000000 00000101

                                           两个字节存储int -5

                                        5的补码取反:11111111 11111010

                                        加1:11111111 11111011    (-5的补码)

                                2)在存放整数的存储单元中,左边的第一位表示符号,0:数值为负;1:数值为正

                                        int  两个字节:

                                                存储单元中最大值:01111111 11111111        2^15-1

                                                存储单元中最小值:10000000 00000000        -2^15

                                                即范围:-32768~32767

                                        int 四个字节:

                                                范围:-2^31~(2^31-1)        既 -2147483648~2147483647

        2、短整型(short int):类名:short int 或 short

                长度:VC6.0中,2个字节

                存储方式:与int相同,-32768~32767

        3、长整型(long int):类名:long int 或 int

                长度:在VC6.0中,4个字节

                储存方式:同int, -2147483648~2147483647

        4、双长整型(long long int):类名:long long int 或 long long

                长度:一般都是8个字节,C99新增,有的编译器不支持

        说明:

            1)C标准中没有规定各种类型数据具体长度,均优编译器决定,但是规定了long类型长度不短于int类型长度,

                short类型长度不长于int长度。

                      sizeof(short)<=sizeof(int)<=sizeof(long)<=sizeof(long long)

                                        short        int        long

                     Turbo C         2            2            4

                      VC6.0           2            4            4

               2)实际使用中,把long定为32位,short定为16位,int既可以为16位也可以位32位:

                      如果将A系统移到B系统,要注意溢出问题:

                            如4字节的int 50000,如果赋值给2字节的int,就会溢出,只能降int修改位long

               3)整型变量的符号属性:

          

        5、字符型数据(char):

                1)字符与字符代码:

                    长度:1个字节

                    存储方式:采用ASCII字符集(一个127个字符)

                            字母:A~Z,a~z

                            数字:0~9

                            专门字符:29个

                                    ! " # & ' ( ) * + , - . / : ; < = > ? [ \ ] ^ _ { | } ~

                            空格符:空格、水平制表符(tab)、垂直制表符、换行、换页(form feed)

                            不能显示的字符:空(null)字符(以 '\0' 表示)、警告('\a')、退格('\b')、回车('\r')

                         字符使用ASCII代码存储,1个字节8位、首位为0,直接使用该二进制存储:

                            如:'a'    ASCII中十进制数为97    二进制位01100001

                2)字符变量:

                        char c = '?'

                        ASCII代码位63,系统直接将整数63赋值给c,c就是字符变量,实质上是一个字节的整型变量,输出:

                        printf("%d,%c\n",c,c);

                        结果:63,?

                3)符号类型:

             

        6、浮点型数据:

                6.1、浮点机中表示(还有一种叫做定点机表示):

                       1) 浮点数的表现形式:N=S * r^j

                                 

                        2)范围:


                        3)规格化:将整数部分化为0,小数部分第一位不为0的浮点数形式。

                        4)例子:

             

                6.2、IEEE 754标准(VC6.0编译器也是使用的这个标准):

                            现代计算机中,浮点数一般都是采用的IEEE制定的国际标准

                    标准如下:

                                

                            说明:符号位S表示整个浮点数的正负,阶码存储的是阶码的真值加一个常数(偏移量:127)

                                 尾数通常都是规划化(非0的最高为总是1)表示,但是在IEEE标准中,有效位如下

                                格式:1.fff....fff

                                最终放入尾数时,将整数部分的1忽略,直接用放后面的fff...fff,不足位数,在最后面添0。

                             例子:求178.126在计算机中的存储方式

                                    原始十进制数:178.126

                                    转化位二进制:10110010.001

                                    二进制浮点表示:1.0110010001*2^111

                                                注意:这里的2^111中,111是二进制数,就是阶码的真值

                                    接下来,使用短实数来表示:

                                            数符:0

                                            偏移的阶码:00000111+01111111=10000110

                                                        注意:这里就是阶码的真值加上127,然后作为阶码,加上127原因为了

                                                                区分阶码真值的正负数,最终计算机来取这个数时,会主动减127

                                            尾数:01100100010000000000000

                                                        注意:这里的尾数应该要忽略二进制浮点数的整数位1,然后不足短实数

                                                                中定义的23位,就在结果补0

                                            所以计算机中178.126短实数的二进制存储为:

                                                         01000011001100100010000000000000

                                使用以下程序可以测试:

            #define _CRT_SECURE_NO_WARNINGS 1
            #include<stdio.h>
            #include<string.h>
            int main()
            {
    	         float value = 178.126;
                    unsigned long buff = 0;
                    memcpy(&buff, &value, 4);//内存拷贝
                    for (int i = 31; i >= 0; i--)
                    {
                        if (((buff >> i) & 1) == 1)
                        {
                            printf("1");
                        }
                        else
                        {
                            printf("0");
                        }
                    }
    	        return 0;
            }
    

                        结果为:

                    

                                  


    展开全文
  • C语言中变量按其作用域分,可分为局部变量和全局变量,具体的解释为: 局部变量(内部变量):定义它的函数内有效,但是函数返回后失效; 全局变量(外部变量):所有源文件内均有效。同源文件的函数使用...

    局部变量和全局变量

    C语言中变量按其作用域分,可分为局部变量和全局变量,具体的解释为:

    • 局部变量(内部变量):在定义它的函数内有效,但是函数返回后失效;
    • 全局变量(外部变量):在所有源文件内均有效。在同源文件的函数中使用使用全局变量,需要将全局变量提前声明;同时在不包含全局变量定义的不同源文件需要用extern关键字再次声明。

    关于C语言全局变量和局部变量,还有几个注意点:

    • 如果在该函数内定义了一个与之前定义的全局变量同名的变量,那么该同名局部变量就会在函数内部屏蔽全局变量的影响。即当局部变量与全局变量同名时,在局部变量的作用范围之内,全局变量不起作用。局部变量优先原则
    • 全局变量是有默认值的(引用类型的变量默认值都是null,基本类型的变量默认值则不一样,int型变量默认值是0),但是局部变量没有默认值;
    • 全局变量可以在函数外定义并初始化,但不能进行赋值操作。这是什么意思呢?我们看一下:
    #include<stdio.h>
    
    int a = 0;
    
    int main()
    {
    	printf("%d\n", a);
    
    	return 0;
    }

    此时程序运行通过,程序中a为全局变量,在函数外进行定义并初始化。

    #include<stdio.h>
    
    int a = 0;
    a = 1;
    
    int main()
    {
    	printf("%d\n", a);
    
    	return 0;
    }

    此时程序运行错误。全局变量在函数体外只能进行初始化,不能进行赋值运算。

    #include<stdio.h>
    
    int a;
    a = 1;
    
    int main()
    {
    	printf("%d\n", a);
    
    	return 0;
    }

    此时程序运行通过,C语言执行过程中,对代码进行了优化,把程序2中的int a;a=1;优化为一句话:int a=1;这就是初始化。

     

    变量的存储类型

    C语言中变量按其存在的时间(即生存期)分,可分为动态存储变量和静态存储变量。

    • 动态存储变量:当程序运行进入定义它的函数或复合语句时才被分配存储空间,程序运行结束离开此函数或复合语句时,所占用的内存空间被释放。这是一种节省内存空间的存储方式;
    • 静态存储变量:在程序运行的整个过程中,始终占用固定的内存空间,直到程序运行结束,才释放占用的内存空间。静态存储类别的变量被存放在空间的静态存储区。

    在C语言程序运行时,占用的内存空间被分成三部分:程序代码区、静态存储区、动态存储区

    程序运行中的数据分别存储在静态存储区和动态存储区。静态存储区用来存放程序运行期间所占用的固定存储单元的变量,如全局变量等;动态存储区用来存放不需要长期占用内存的变量,如局部变量等。

    变量的存储类型具体来说分成4种:自动类型(auto)、寄存器类型(register)、静态类型(static)、外部类型(extern)。其中,自动类型、寄存器类型的变量属于动态变量,静态类型、外部类型属于静态变量。

    自动变量(auto)

    自动类型是C语言程序中使用最广泛的一种类型。函数中的局部变量,如果不专门声明为static存储类型,都是动态分配存储空间的,数据存储在动态存储区。函数中的形参和函数中定义的变量都属于此类。在调用这些函数时,系统会给它们分配存储空间,在函数调用结束后就自动释放这些存储空间。

    • C语言规定:函数内凡未加存储类型说明的变量均视为自动变量,也就是说,自动变量可省略说明符auto,说明符auto不写则隐含表示该变量为自动存储类型的。
    • 对于自动变量来说,如果不赋初值,它的值是一个不确定的值。

    自动变量的一般形式为:

    {
        (auto) 类型 变量名;
    }

    静态变量(static)

    静态变量存储在静态存储区,用static关键字来声明。属于静态存储方式,又可分成静态全局变量和静态局部变量。

    C语言规定:静态变量(包括静态局部变量、静态全局变量)有默认值,int型等于0,float型等于0.0,char型等于'\0'。而自动变量和寄存器变量没有默认值,是随机值。

    • 静态局部变量:只在定义它的函数内有效。只是程序仅分配一次内存,函数返回后,该变量不会消失,只有程序结束后才会释放内存;
    • 静态全局变量:只在定义它的文件内有效,且生存期在整个程序运行期间。

    静态变量的一般形式为:

    static 类型 变量名;
    {
        static 类型 变量名;
    }
    几个变量的区别
    变量类型存储类型存储区域作用域
    局部变量自动变量(auto)动态存储区定义它的函数
    静态局部变量静态变量(static)静态存储区定义它的函数
    全局变量外部变量(extern)静态存储区所有的源文件
    静态全局变量静态变量(static)静态存储区定义它的源文件

    static关键字的作用:

    • 在函数体中,一个被声明为静态的变量在这一函数被调用过程中只会被分配一次内存,且整个运行期间不会重新分配;
    • 在函数体外、某个源文件内,一个被声明为静态的变量只可被该源文件内的所有函数访问,但不能被其他源文件的函数访问。它是一个本地的全局变量;
    • 在某个源文件内,一个被声明为静态的函数仅仅只可以被这个源文件的其它函数调用。也就是说,这个函数被限制在声明它的源文件的本地范围之内使用。

    也就是说,static的作用主要体现在两点上:

    • 对于局部变量而言,加上static,就将数据保存到静态存储区,仅分配一次内存,生存期大大加强(改变存储区域);
    • 对于全局变量而言,由于本身已经在静态存储区,加上static,就将变量作用域限制到定义它的源文件内(改变作用域)。

    对于函数也是一样,限制范围。而不限制全局变量和函数范围的时候,其他源文件需要引用的时候,都需要extern关键字。

    寄存器变量(register)

    除了常用的自动变量和静态变量之外,C语言还提供了一种帮助程序员利用CPU寄存器的方法。使用关键字register来声明局部变量时,该变量即称为寄存器变量。寄存器变量是动态局部变量,存放在CPU的寄存器或动态存储区中,该类变量的作用域、生存期和自动变量相同。如果没有存放在寄存器中,就按自动变量处理。

    寄存器变量的好处是:寄存器的存储速度比内存快得多。但是由于现在编译系统的优化,使得编译器可以自动识别频繁使用的变量,并自动将其存储在寄存器中,故而现在寄存器变量的定义是不必要的。

    寄存器变量的一般形式为:

    {
        register 类型 变量名;
    }

    register由于是在寄存器(动态存储区)中,所以,寄存器变量不可能同时又是全局变量或者静态变量!

    外部变量(extern)

    外部变量(即全局变量)是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量作“外部变量声明”。表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。

    在一个文件中定义的全局变量默认为外部的,即关键字extern可以省略,但如果在其他的文件中使用这个文件定义的全局变量,则必须在使用前用extern进行外部声明。

    外部变量的一般形式为:

    extern 类型 变量名;

    extern关键字的作用:

    • 在本文件范围内扩展外部变量的作用域;
    • 将外部变量作用域扩展到其他源文件中。

    解释:当编译开始的时候,编译器总能从使用extern进行外部变量声明的地方开始在本文件中查找外部变量的定义。如果外部变量的定义在本文件中找到,那么外部变量的作用域就在本文件中进行扩展;如果本文件中没有找到,编译器就会去其他文件中查找外部变量的定义。这时,变量的作用域就扩展到了其他文件。

     

    展开全文
  • 跟同事讨论代码时,经常冒出声明一个变量、定义一个变量的话。虽然感觉没什么差别,但总是混淆不清,心里难受。查下资料,总结做个笔记总是没错的。 一:两者的定义 ...在C语言中,所有的变量都必...
  • 详解C语言中变量

    千次阅读 2020-03-04 23:40:42
    变量在C语言中就是一个容器,通常是一块内存。 声明变量 变量类型 变量名; 例如: int x; 上面的代码里,int就是变量类型,x就是变量名。变量类型用来说明数据宽度,变量名的命名规则与函数名一致。。 变量...
  • 在C语言中,对变量的存储类型说明有以下四种: auto 自动变量 (动态存储) register 寄存器变量(动态存储) extern 外部变量(静态存储) static 静态变量(静态存储) 所谓存储类型是指变量占用内存空间...
  • c语言变量名、变量和地址的关系

    千次阅读 多人点赞 2019-05-08 12:00:56
    c语言变量名、变量和地址的关系 定义 变量:用来标识一块内存区域,即变量就是一块内存区域,而这个区域里面的值可以更改,故叫做‘变’量 变量名:是一个标识符,用来指代一块内存区域,即变量,变量名并不占用内存...
  • 最近做笔试题经常会遇到C语言中类型变量所占字节数的问题,索性这里做一个整理总结。 下面给出一个表格,方便查看个类型的字节数:   ...
  • C语言中变量的存储类型有几种?

    千次阅读 多人点赞 2016-04-04 17:40:10
    在C语言中,对变量的存储类型说明有以下四种:  auto 自动变量  register 寄存器变量  extern 外部变量  static 静态变量  所谓存储类型是指变量占用内存空间的方式,也称为存储方式。变量的存储方式可分为...
  • C语言变量的属性

    千次阅读 2020-07-31 10:17:55
    (2)类型 (必须显示说明) (3)存储类别 (缺省方式或显示说明(使用:auto、register、static、extren)) (4)作用域 (由存储类别决定) (5)生存期 (由存储类别决定) 变量的存储类别 定义:指系统对变量...
  • C语言中不同类型变量的解读

    千次阅读 2018-07-20 23:17:23
    C语言中变量分为四类,分别是 auto 自动变量 tatic 静态存贮分配变量(又分为内部静态和外部静态) extern 全局变量(用于外部变量说明) register 寄存器变量(分配硬件寄存器) 四大类,所有变量必须先...
  • C语言变量命名规则

    千次阅读 2018-07-13 14:02:01
    一、程序风格: 1、严格采用阶梯层次组织程序代码:...例如: 2、提示信息字符串的位置 程序需要给出的提示字符串,为了支持多种语言的开发,除了一些给调试用的临时信息外,其他所有的提示信息必须定义资源...
  • C语言

    万次阅读 多人点赞 2019-12-18 23:01:50
    46.用c语言编写程序,可以编写出任何类型的程序 47.C语言允许有空函数 48.C程序书写格式,允许一行内可以写几个语句 49.C程序的语句无行号 50.C语言的每个语句的最后必须有一个分号 51.C语言本身没有输入...
  • 一、在C语言中如何定义一个枚举类型并使用? 二、在C语言中如何定义一个结构体类型并使用? 一、在C语言中如何定义一个枚举类型并使用? 以一周的七天为例,定义一个枚举型变量: enum WEEK_TYPE ...
  • C语言中变量的存储类别

    千次阅读 2019-06-07 17:59:18
    C语言中变量的存储类别: 自动类型(auto) 寄存器类型(register) 静态类型(static) 外部变量(extern) 自动类型(auto) 自动类型(auto)变量是存储动态存储区的变量。 关键字:auto 一般形式为:auto 类型 变脸...
  • c语言中变量占用字节数

    千次阅读 2019-09-04 20:26:33
    c语言中变量占用字节数 最近看深入理解计算机系统这本书,上面提到了32位机器和64机器int类型都占用4个字节。后来,查了The C Programming language这本书,里面有一句话是这样的:Each compiler is free to ...
  • 之前做项目时候遇到一个问题,比如说一个流程有很多个step,这些我用一个enum来定义,比如: enum ACTION { ACTION_jiashui = 0, //加水 ACTION_jiaoban, //搅拌 ACTION_biaoding, //标定 ACTION_...
  • c语言-变量的四种存储类型

    千次阅读 2018-07-03 11:19:24
    auto 自动变量register 寄存器变量extern 外部变量static 静态变量 一般形式:存储类型说明符 数据类型说明变量名,变量名...static int a,b; auto char c1,c2; static int a[3]={1,2,3}; extern int x,y;...
  • C语言变量声明时加冒号的用法

    千次阅读 2020-05-28 15:47:24
    C语言变量声明时加冒号的用法   有些信息存储时,并不需要占用一个完整的字节, 而只需占一个或几个二进制位。例如存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便...
  • C语言局部变量在内存栈的顺序

    千次阅读 2017-08-23 20:44:10
    首先总结规则,详细分析见下面: 规则1:内存由低到高优先分配给占位8字节、4... 数据类型占位说明: 8字节:double、longlong int 4字节:int、float、long int、unsigned int 2字节:short 、unsigned short
  • 我现在重新拾起我大一学过的不懂皮毛的C语言,我现在重新学,希望学得更加的扎实,把基础打牢,我现在会不定时的分享我学C语言路上总结归纳的一些学习资料,用博客记录下来,希望方便自己的同时也给大家带来收获!...
  • c语言中的存储类别可分为auto、static、register和extern,后两者不常用,研究下前两个。 auto即自动,用此关键字修饰变量为自动的,亦即当执行到定义该变量的代码时会产生一个新的变量,我们做个小实验: #...
  • Q:C语言编程,为什么要有变量变量是做什么的,在C语言中如何定义一个变量? A:在C语言编程,当我们需要保留数据时,所以就需要一个变量保存它,用一个变量保存了数据,它才能参加后面程序的运算。 所以...
  • C语言中变量

    千次阅读 2016-09-29 19:17:14
    开场白要吸引人.......但是我不会 ,有人说我可以靠脸吃饭。...下面我就来提提C语言中关于变量的意思 什么是变量?  没错 你看字面意思就可以理解,就是可以变得量,用专业一点的话就是程序其值可以变化的量。
  • C语言数据类型转换

    千次阅读 2020-03-04 09:56:45
    文章目录一、自动类型转换1、操作数没有浮点型数据时2、操作数有浮点型数据时3、赋值运算符两侧的类型不一致时4、右值超出左值类型范围时二、强制类型转换三、课后作业四、版权声明 计算机进行算术运算时,要求...
  • c语言之函数变量

    千次阅读 2020-05-29 17:18:40
    一、局部变量与全局变量 ... 一个函数内部,复合语句(块)定义变量,这些变量本复合语句有效。 如果局部变量的有效范围重叠,则有效范围小的优先。 #include "stdio.h" void main() { int i=2,j=3,k;
  • 结构体Elf32_Ehdr和Elf64_Ehdr成员名称是一样的,函数想要根据e_ident[EI_CLASS]的值不同 ,使用不同的结构体。 请问各位大师怎么实现?小弟是个新手,麻烦附上实现代码,非常感谢! ![图片说明]...
  • C语言中变量声明和定义

    千次阅读 2016-08-17 20:15:13
    很多初学者,对变量的定义和声明分不请,C和C++略有不同,再加上const、static、extern就更加混乱,下面就此问题给予详细讲解并举例说明变量的定义:为变量分配存储空间,同时指明变量类型和名字。另外...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 147,612
精华内容 59,044
关键字:

在c语言的变量类型说明中

c语言 订阅