首先要熟悉C语言的全局变量和局部变量的含义:

C语言中的变量详解
 
先说说变量的作用域,比如,在函数中,形参变量只是在被调用期间才分配内存单元,调用结束立即释放。这就说明形参变量只有在函授内才是有效的,离开该函数就不能再使用了。
 
这种变量有效性的范围称为变量的作用域。当然不仅仅是形参变量,在C中所有的量都有自己的作用域。
C中的变量,按作用域可分为两种,局部变量和全局变量。
局部变量:
也称内部变量。局部变量是在函数内做定义说明的,其作用域仅限于函数内部,离开函数后再使用这种变量是非法的。
如:  void delay(unsigned int  x)
      { unsigned char  i,j;  //i  j  的作用域只是在delay函数内
 
       }
关于局部变量的作用域的几点说明:
1、主函数中定义的变量也只能在主函数中使用,不能在其他函数中使用。同时,主函数中也不能使用其他函数中定义的变量。因为主函数也是一个函数,它与其他函数是平行关系。
2、形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。
3、允许在不同函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。
4、在复合语句中也可以定义变量,其作用域只是在复合语句范围内。
   比如:   main( void)
        {
         Int s,a;
         ……
            {
               Int b;
                s=a+b;
                ……     //b的作用域
             }
          ……           //s,a的作用域
         }
全局变量
也称外部变量,在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。在函数中使用全局变量,一般要作全局变量说明。只有在函数内经过说明的全局变量才能使用。全局变量的说明符extern。但在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。
 
 
 
 
如:    int a,b; // 外部变量  a,b
        Void   f1( )
        {
          ……
         }
       Float  x,y;//外部变量  x,y
        Int  f2( )
        {
          ……
         }
        Main(  )
        {
         ……
         }
在上例中,a b x y都是在函数外部定义的外部变量,都是全局变量,但是x y定义在F1函数之后,在F1中又无对x y的说明,所以x y在F1函数中是无效的,a b 定义在源程序的最前面,因此在F1 F2及main函数中即使不加以说明仍然可以使用。这也是在单片机编程中把全局变量写在程序函数之前的原因。
如果同一个源文件中,外部变量与局部变量同名,则局部变量的作用范围内,外部变量被“屏蔽”即不起作用。
用extern声明外部变量
外部变量是在函数的外部定义的变量,其作用域是从变量定义处开始,到本程序文件的末尾。如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件的结尾。如果在定义点之前的函数想引用该外部变量,则应在引用之前用关键字extern对该变量作“外部变量声明”。表示该变量是一个已经定义的外部变量。
#include<reg52.h>
unsigned int  a,b;
void sumab()
{
 unsigned int s1,s2 ;
 extern unsigned int x,y;
 s1=a+b;
 s2=x+y;
}
void main()
{
 sumab();
 while(1);
}
 
unsigned int x=3,y=4;
 
程序的最后1行定义了外部变量x,y,但由于外部变量定义的位置在函数main之后,本来是在main中不能引用外部变量x,y。当在main函数中用extern对x,y进行了“外部变量声明”,就可以从“声明”处起,合理的使用该外部变量x和y。
变量的存储类别
动态存储方式和静态存储方式
变量从作用域(空间)上分为全局变量和局部变量。
从存在的时间(生存期)的角度可分为静态存储方式和动态存储方式。
静态存储方式:在程序运行期间分配固定的存储空间的方式。
动态存储方式:在程序运行期间根据需要进行动态的分配存储空间的方式。
用户存储空间可以分为三个部分:
1、程序区
2、静态存储区
3、动态存储区
全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序执行完毕就释放,在程序执行的过程中它们占据固定的存储单元,而不动态的进行分配和释放。
动态存储区存放如下的数据:
1、函数形式参数
2、自动变量(未加static声明的局部变量)
3、函数调用的现场保护和返回地址;
对于上面的数据,在函数开始调用时分配动态存储空间,函数结束时释放这些空间。
在C中,每个变量和函数有两个属性:数据类型和数据的存储类别。
Auto变量
局部变量,如不专门声明是static存储类别,都是动态地分配存储空间的,数据存储在动态存储区中。自动变量用关键字auto作为存储类别的声明。也可以隐含不写,系统默认是auto.
static声明局部变量
加入希望函数中的局部变量的值在函数调用后不消失而是保留原值,这时可以将局部变量用static进行声明,变为“静态局部变量”。
对静态局部变量的说明:
1、静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序运行期间都不释放。
2、静态局部变量在编译时赋初值,即只赋初值一次;而对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。
3、如果在定义局部变量时不赋初值的话,对静态局部变量来说,编译时自动赋初值0或空字符。而对自动变量来说,如果不赋初值则它的值是一个不确定的值。
Register变量
为了提高效率,C允许将局部变量的值放在CPU中的寄存器中,这种变量就叫寄存器变量,用关键字register声明。
说明:
1、只有局部变量和形式参数可以作为寄存器变量
2、一个计算机系统中的寄存器数目是有限的,不能定义任意多个寄存器变量。
3、局部静态变量不能被定义成寄存器变量。

lr其实也是一样:

在lr中,当局部变量和全局变量同名时,在局部变量的作用范围内,全局变量不起作用,

例如在lr中,在Action()函数外部,定义了全局变量a=10,然后在Action()内部定义了局部变量a=8,则在Action()中打印a的值应该为8,而不是10

lr如何屏蔽全局变量的影响的更多相关文章

  1. C语言局部变量和全局变量的区别。——Arvin

    局变量是使用相同的内存块在整个类中存储一个值. 全局变量的存在主要有以下一些原因:  1,使用全局变量会占用更多的内存(因为其生命期长),不过在计算机配置很高的今天,这个不成为什么问题,除非使用的是巨 ...

  2. c语言全局变量和局部变量问题汇总

    .局部变量是否能和全局变量重名? 答:能,局部会屏蔽全局.要用全局变量,须要使用"::" 局部变量能够与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变 ...

  3. C语言局部变量和全局变量问题汇总

    1.局部变量能否和全局变量重名? 答:能,局部会屏蔽全局.要用全局变量,需要使用"::" 局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变 ...

  4. $_GLOBALS超全局数组和global定义的全局变量区别?

    全局变量:主程序中定义的变量(函数外部),只能在主程序中使用,在函数内部不能调用 背景:解决在函数内部调用全局变量的问题 解决方法: 1.在函数内部声名全局变量 <?php public $va ...

  5. [故障公告]博客站点遭遇超过20G的流量攻击被阿里云屏蔽

    2017年2月21日17:34,突然收到阿里云的通知: 您的IP受到攻击流量已超过云盾DDoS基础防护的带宽峰值,服务器的所有访问已被屏蔽,如果35分钟后攻击停止将自动解除否则会延期解除... 紧接着 ...

  6. global关键字修改全局变量

    #我们知道全局变量在函数外部,强烈建议不要在函数内部修改全局变量,正常情况下,在函数内部改变全局变量并不影响全局变量的值,举例如下 count = 5 >>> def myfun() ...

  7. JS的全局变量与局部变量及变量的提升

    遇到全局变量与局部变量的时候总是出一些或多或少的问题,于是专门花时间去认真研究了一下全局变量与局部变量. 这是在网上看到的一个关于全局变量与局部变量的代码,看了下作者的解析,自己也进行了研究. < ...

  8. 01-C#入门(函数一)

    只有在动手写代码的时候,才能真正理解到代码的逻辑思想,所以,开始写代码吧. 函数的意义:降低相同功能的代码重复编写,提高重复代码的维护效率. 函数 一个文件由命令空间(namespace).类(cla ...

  9. Atitit 作用域的理解attilax总结

    Atitit 作用域的理解attilax总结 1.1. 作用域是指对某一变量和方法具有访问权限的代码空间, 1 1.2. 作用域的使用提高了程序逻辑的局部性,增强程序的可靠性,减少名字冲突.1 1.3 ...

随机推荐

  1. Qt ------ QString 操作

    QStringList QString::arg     ------- 字符串的格式化处理,类始于sprintf 比如:QString("%1").arg(10,2,16,QLa ...

  2. Linux iptables:规则组成

    <Linux iptables:规则原理和基础>介绍了iptables的四表五链,简单说就是不同的网络层数据包会经过哪几个挂载点,在每个挂载点可以在哪张表进行规则定义. 本篇沿着这个思路, ...

  3. python基础--文件操作实现全文或单行替换

    python修改文件时,使用w模式会将原本的文件清空/覆盖.可以先用读(r)的方式打开,写到内存中,然后再用写(w)的方式打开. 替换文本中的taste 为 tasting Yesterday whe ...

  4. MSBuild问题积累

    我想要当属性ConfigurationType定义为StaticLibrary时,将其重新定义为StaticLibrary,按照以下来做,实现不了. <ConfigurationType> ...

  5. OpenCV---开闭操作

    一:开操作(先腐蚀后膨胀) 特点:消除噪点,去除小的干扰块,而不影响原来的图像 import cv2 as cv import numpy as np def camp(val1,val2): pv ...

  6. 如何卸载掉eclipse中的插件

    First-->Help->About Eclipse Second--> Third-->

  7. 2017 Multi-University Training Contest - Team 1

    1006(6038) 就是对a,b分别求循环节,先统计一下b中所有长度循环节的出现次数,再对a求循环节时只要满足: a的循环节长度 % b的循环节长度=0,那么这个b的循环节就可以计入答案,尼玛只要是 ...

  8. 重构改善既有代码设计--重构手法08:Replace Method with Method Object (以函数对象取代函数)

    你有一个大型函数,其中对局部变量的使用,使你无法釆用 Extract Method. 将这个函数放进一个单独对象中,如此一来局部变量就成了对象内的值域(field) 然后你可以在同一个对象中将这个大型 ...

  9. 51Nod - 1006 最长公共子序列Lcs模板

    给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的).   比如两个串为:   abcicba abdkscab   ab是两个串的子序列,abc也是,abca也是,其中abca是这 ...

  10. 设置display:inline-block产生间隙

    display:inline-block产生间隙,是由于换行在内的空白符 display:inline-block在IE下仅仅是触发了layout,而它本是行布局,触发后,块元素依然还是行布局.所以需 ...