变量大全, 局部变量,全局变量,变量的存储类别

  • List item

  • 今天分享有关变量的有关知识。其中涉及知识点有全局变量,局部变量, 作 用域存在重叠区的同名变量,变量的储存类别(自动,寄存器,外部,静态 变量)。

  • 话不多说,开始!
    变量都有作用域。作用域就是势力范围。按照作用域,可以将变量分成两种变量:全局变量和局部变量。我把他们的关系类比于分封治,全局变量就类似于中央皇帝,局部变量就是诸侯王。皇帝势力遍布全局,诸侯王只在自己的一小块地方。下面具体介绍分类。

  • 局部变量:在一个函数内部定义的变量都是局部变量,主函数也不例外,也被称为内部变量。其中也包括函数的形参。他们的作用域也仅仅在函数内部。可能有人会说了,那不是还有函数调用么,形参不是会接受调用函数的变量么?其实这样并不对。一是函数调用是在函数体内调用的,所以可以说的是内部,但是这并不是意味着实参的局部变量可以直接穿过被调用函数。形参进行的是值传递,只是将实参的数值传下来,但实际上实参自己并没有下来。这就好比调用函数这个大诸侯局部变量,不能穿过下面小诸侯一样。但是我可以借用形参来传递我这个大诸侯命令给小诸侯。那会不会形参会跑到外面啊?如果从定义来看不会,我自己想了一个办法,比如说大诸侯的变量和小诸侯变量都跑到势力划分的界限,假如啊大诸侯在边界build 个墙,这两个人就在边界,把各自要传递的信息扔到墙那边,这样便没有接触,也只是在各自势力范围。此外分封制还有卿大夫呢,所以局部变量还有在一个程序块中进行变量的定义的。就类似再分个卿大夫出来形成更小的诸侯。

  • 全局变量:在函数外定义的就是全局变量,也称为外部变量。全局变量属于一个源程序文件,具有文件作用域。其作用域是从其定义的地方开始一直到源程序文件结束。一个源程序文件就是咱们平常的一段代码文件。当程序包含多个文件时,也可以在其他的文件使用全局变量。如果把一个文件比作一个国家,那么可以在其他文件使用的全局变量就是所有国家的能使用的账户,就类似于跨国银行一样,只要在一个国家开过户,全球通用。(我没开过,嘿嘿只是一个比喻啊)那么作为全球通的全局变量肯定会与众不同的嘛,如果你在其他的文件使用这个全局变量,就必须使用关键字extern进行声明注意不是定义。声明就是开个证明,加上extern,就可以在这个国家通用了,就好像护照作用一样哈。(类比不恰当,谅解,我没办过这个东西。)记住每次使用都要带着extern。至于在本国就不需要了。定义就是开户,只要开一次就行了,无论你在哪个国家开的户。通常全局变量定义集中放在源程序文件的各个函数前面,这样,其作用范围将覆盖源程序的所有函数。

  • 利用全局变量的优点就是可以在全局改变数值,就不需要再利用指针啥的。但是全局变量的使用也会带来变量占用的内存一直保留到程序结束,使用时间长,此外也会导致函数使用的通用性,因此原则上尽量少使用。
    全局变量和局部变量的定义就是不同的变量定义,不再过多叙述,有需要的同学可以看看书。
    作用域存在重叠的同名变量:就是一句话强龙不压地头蛇,到了谁的地盘谁就是老大。新的声明将会在其的作用域内隐藏旧的声明,就是说在同名变量内最新声明的变量是可见的。

    变量的存储类别:
    之前学习对某一个变量的定义,只是对其说明了数据类型(int等),其实我们还要给他一个属性就是储存类别。储存类别涉及程序执行时变量存在的时间和在硬件中的位置。
    储存类别的关键字

  • auto:自动变量

  • register:寄存器变量

  • extern:外部变量

  • static:静态变量
    前两种是动态存储方式,后两种是静态储存方式。顾名思义,动态就是在使用的时候开辟,不用的时候就释放,静态储存方式就是一直到程序结束,我们从外部变量就可看出。

供C语言使用的储存区域大致分为:

  1. 程序代码区:保存函数的二进制代码。这部分区域是只读的。
  2. 字符串常量区:保存字符串常量。这部分区域也是只读。
  3. 静态存储区:存放所有的全局变量和静态变量的值。在程序时分配,程序结束后由系统释放。区域存在,所保存的值也一直在。静态存储的变量自动进行初始化。初值为0,字符型就是’\0’(其实也是0);
  4. 栈区:主要存放函数的形参变量和非静态局部变量的值。这部分区域由系统自动分配和释放。随着函数的调用和返回,栈区的数据会动态变化。就像客栈一样,动态变化。放在栈区的变量均采用动态储存方式。因此,函数被调用多次的时候,每次为其局部变量的分配到内存地址可能并不相同,系统不会自动为这类变量赋初始值,其初始值不确定。
  5. 堆区:在程序运行期间可以向系统申请一片内存,使用完毕后主动释放。这种动态申请的内存就是堆区。我对栈区和堆区的理解就是,客栈是官方划地,客栈地址不会发生改变,但是客栈里的人是可以走的。堆区呢,就像是移动的简易客栈,随时申请,我随时划地给你间客栈,用完了,地收回来,客栈也就不存在,打一枪就跑的意味。强调客栈地址变化。
    储存类别
  6. 自动变量 :关键字auto声明,函数中局部变量便是此类,除了已经有static表明了。函数形参为函数的局部变量也包含。变量放在运行栈区是动态分配储存空间的。由于大部分变量的都是自动变量,C语言规定auto通常在局部变量的定义中可以省略不写。
  7. 寄存器变量 关键字 register计算机含有通用寄存器,其作用是存放参加运算的操作数据以及部分运算的后中间结果。Cpu使用寄存器的数据速度远远超过使用内存的数据速度。注意只有int,short,char类型的变量才允许定义为寄存器的变量。寄存器变量的作用域和生命周期和自动变量是一样的。故只有自动类局部变量才可以作为寄存器变量。寄存器分配的方式也是动态分配的。不过现在随着技术更新等等,使用寄存器定义变量基本无作用效果。
  8. 外部变量:就补充一点若全局变量定义在文件最后,也就是在本国一直到最后才开户,**那么本国前使用也要加上证明即extern。**记住只开一次户。
  9. 静态变量: 关键字:static。所有全局变量和用static声明的静态局部变量都属于静态变量。放在静态储存区。储存单元一旦分配便不会改变直至结束。静态局部变量也是具有函数作用域的,初值也只是复制一次。静态局部变量也是诸侯,只不过静态的话就是分封的地盘固定死了,王位也是世袭了。特别注意的是由于全局变量都是静态类的,在定义时就不需要使用static。但是如果全局变量加上了static,则该全局变量就只能在其定义的所在的文件被使用,说白了,就是不能出国了,本国照常使用。
    希望对大家有所帮助。若有问题,请批评指教,感激不尽!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值