变量作用域

来源:互联网 发布:本地域名服务器 编辑:程序博客网 时间:2024/05/21 09:55

前言:

        我们在程序中定义变量,到底是什么。。

        提到变量,我们想到的是什么。。

        一般对于变量,要么读,要么写。读变量也就是获取变量中存储的数据,写变量也就是对变量的内容进行修改

       在机器底层,根本不存在所谓的变量,有的只是一块块内存空间,int 类型的变量,对应4个字节空间,double 类型的变量,对应8个字节的空间。而变量名和内存地址就存在一一对应关系,对变量名的操作,实际是对内存的操作,但是我们不需要关系,数据存在那一片内存中,变量名的存在帮我们屏蔽了很多细节,我们可以不需要了解底层实际的操作,极大的减小了我们编程的难度。


正文:


       这就是程序在内存中的分布

       代码区:程序转换成指令,指令存储的地方,PC(程序计数器)只会在这块区域移动

       数据区:数据段属于静态内存分配。

       堆区:动态内存分配时,数据存储的地方

       栈区:函数在调用时,数据临时存放的区域


     变量的定义 :只能有一次

int k ; int k = 10;extren int k = 10;// 三条语句只能写一次


     变量的声明 : 将内存空间与变量名建立对应关系,声明可以多次,声明并不会开辟新的空间,而只是将变量与已经分配的空间营销映射

extren int k  ;// 语句可以写多次,写在任何地方


文件 A  int k ;  // 变量对应地址为 S文件 B extren int k ; // 告诉系统,k 对应地址为S

文件A中是对变量的定义,开辟空间,建立映射

文件B 是对变量的声明,只会进行映射,两个变量公用空间S


      变量分两种

     ( 1) 全局变量  ,静态数据,程序从运行到开始一直存在 ,存放在数据区

      (2)局部变量,自动变量,函数调用结束空间就释放,存放在栈区


     变量的作用域

   (1) 文件作用域 ,定义在代码块外

int a ;{      .......      // 两个括号之间的语句,构成代码块}

变量a存储在数据区

变量a 一直等到程序结束才销毁,所以不同文件可以共享a对应这片内存,只需在每个文件中包含声明,

extren int a;

但是 static 关键字可以改变这种属性,比如我想定义一个变量,只是在本文件中是共享的对其他文件是不可见的

static int b ;


(2) 代码块作用域


{      int a;}

变量a ,只存在堆栈中,只是临时的,等代码块结束,变量就会销毁

所以变量a ,就不存在共享之内的情况,基本上只是在本区域内工作

static 关键字的作用就是,即使代码块结束,变量还是不会销毁,延长了他的生命周期,但是没有什么卵用,变量还是不能共享


讨论作用域重叠的情况

int  aa;{        int aa;}

第一个变量aa 在代码块中也能使用,但是,代码块中已经有一个变量aa,所以,造成重叠

第一个变量aa 映射 的空间 是 A,第二个aa变量映射的空间是B,当我们在代码块中使用变量aa时,映射的是B,出了代码块,使用变量映射的空间是A


作用域不重叠的情况

{      int  a  = 1;}{     int a ;}

第一个变量a 映射 的空间 是 A,第二个a变量映射的空间是B

对于一些优化的系统,两个变量会使用同一块空间,两个变量不可能同时存在,所以可能会共享一个内存地址

(3) 原型作用域

int fun(  int a );

函数声明时,变量a出了这个括号就是没有意义


(4) 函数作用域

add:{     goto add;}

变量add 存的是指令的一个地址,起跳转作用,每个文件内不允许有重名



每个变量的存在都有一定的使命,他们可能存在数据,可能存在地址,不管存什么,都是一块内存空间,就像最后的一个标签,add 中肯定存在一个地址,不然跳到哪里去

高级语言真是屏蔽了很多底层细节


0 0
原创粉丝点击