【编程语言】变量的存储时期/作用域以及static/extern的用法

存储类:

              存储时期       链接         内存管理

对于一个变量(不同的存储类型)可以通过存储时期,链接属性,以及相应的作用域来描述它。

存储时期就是变量在内存中的保留时间,变量的作用域和链接在一起表明程序的哪些部分可以通过变量名来使用该变量。于是就有了不通过的存储时期,链接属性,以及作用域的组合

【1】存储时期(变量的生命期,表示存取一个变量在内存空间的存放以及释放时间)

                          局部变量                寄存器变量               全局变量

1)局部变量(自动变量)的生命周期是在代码块内如果变量被调用才会分配内存空间;直到退出这个代码块的时候,分配的内存被释放。该思想把自动变量使用的内存视为一个可以重复使用的工作区或者暂存内存。

2)寄存器变量 一般变量存储在内存中,但是也有变量被存储在CPU的寄存器中或者存储在高速缓存中,尽可能块的被访问和操作,由于一个寄存器变量存在寄存器而非内存中,所有无法获得寄存器变量的地址,但是在其他方面,寄存器变量和自动变量时一样的,也就是说,他们都具有代码块作用域,空连接以及自动存储时期,可以通过register来表示寄存器变量。

3)全局变量(静态外部变量)它具有文件作用域,外部链接和静态存储时期,把变量定义在所有函数之外,即创建了一个外部全局变量,它具有外部链接的静态变量,即从声明的位置开始一直到文件尾部都是可见的。如果要是程序更加清晰的看懂,可以在外部变量前面加上extern 来声明此变量具有,但我们现在一般都不会加上extern 来声明在本文件已定义的外部链接的静态变量(全局变量),但是当你要引用其他文件的外部链接的静态变量时,此时必须要加extern 来声明。

作用域/链接属性

                外部链接             内部链接             空链接

1)具有代码块作用域或者函数原型作用域的变量有空连接,意味这它们是由其定义所在代码块或者函数原型所私有的

2)用extern 声明的变量具有外部链接属性,表示此变量可以在一个文件或者多个文件的任何地方使用

3)用static 声明的变量具有内部链接属性,表示此变量只可以在本文件任何地方使用,在这里要注意的是用static声明的变量可以是文件作用域的变量(内部链接的全局变量)也可以是具有代码块的局部静态变量,它们的共同特点就是具有静态的存储时期,从一次的函数直到下次的调用,内存中都记录着它们的值,这些变量再完成工作时,并没有消失。但是被声明成具有代码块作用域的静态变量它却是空连接属性

内存管理(变量存储在内存中的位置)(重点)

         变量可以存储在内存中的不同地方,依赖于他们的生存周期,在函数外部定义的变量(全局变量或静态外部变量)和在函数内部定义的static变量,其生存期就是程序运行的全过程,这些数据被存储在数据段(.DATA)数据段是在内存中为这些变量留出的一段大小固定的空间,它分为两部分用来存放初始化的全局变量以及静态全局变量,另一部分用来存放为初始化的全局变量,由于在有操作系统的情况下,未初始化的静态全局变量(static修饰的变量)会被编译器初始化为零,它们的生存期从程序开始执行到其所在的代码块所在位置开始,直到程序离开该程序代码块时为止,而作为函数参数的变量(形参)的调用只在调用函数周期间存在,被存储在栈空间,但是要注意的是被static修饰的静态局部变量虽然只有代码块作用域但它却一直存在内存中,直到下次被刷新。

特别注意

内存空间实际上并不存储变量,但是可以用来存储变量所指向的数据,这里也有点指针的含义,如果把malloc()函数的结果赋给一种指针变量类型,那么指针变量将包含一块动态分配的内存地址,这块内存位于一段名为“堆(HEAP)”的内存空间中,堆一开始也很小,但当程序员调用malloc或者calloc等分配函数时,它就会增大,由于堆可以和数据段或者栈公用一个内存段,当大于一定限度会出现堆栈重叠的情况。

示例代码:

时间: 2024-12-21 12:19:09

【编程语言】变量的存储时期/作用域以及static/extern的用法的相关文章

变量存储类型(auto static extern)

auto 动态存储类型变量(函数内部变量存储默认为 auto型) auto只用于函数内部定义,单片机在执行这个函数时为它分配内存地址,当函数执行完毕返回后,auto变量会被销毁,再次进入这个函数时,它的初值是不确定的,必须对她重新进行初始化.auto变量是局部变量,只允许在定义它的函数内部使用,在函数外的其他地方都不能使用.由于auto变量在定义它的函数以外的任何地方都是不可见的,所以允许在这个函数以外的其他地方或是其他函数内部定义同名的变量,它们之间是不会发生冲突的,因为他们都有自己的区域性,

变量的存储和作用域

初始化和赋值的区别是什么? 初始化:声明变量的时候同时赋值,声明的时候会划出新的内存区域,同时 赋值: 变量的储存方式:静态储存和动态储存. 静态存储:变量定义的时候,分配了一定的内存单元,在整个程序中,内存单元都不变.只能初始化一次,可以多次赋值,静态存储变量不初始化则初始为0. 动态存储:程序执行过程中才分配内存单元,使用完后就释放,如形参.函数的形式参数就是动态存储方式,声明函数的时候不给它分配内存单元.调用的时候传入实参,就分配内存单元,然后函数执行完后,就释放内存.动态存储变量若不初始

c语言 变量的存储类别以及对应的内存分配?

<h4><strong>1.变量的存储类别</strong></h4>从变量值存在的角度来分,可以分为静态存储方式和动态存储方式.所谓静态存储方式指在程序运行期间由系统分配固定的存储空间的方式(<strong>程序开始执行时分配,在程序完毕时释放,在程序过程中它们占据国定的存储单元,而不是动态分配和释放</strong>).而动态存储方式在运行期间根据需要进行动态存储方式(<strong>在程序过程中申请和释放的一些空间&

C++变量的存储类别与作用域

总结一下C++中变量的存储类别以及变量的作用域. (1)标示符的存储类别决定了标示符在内存中存在的时间(我们可以理解标示符就是确定一个变量的符号,也就是我们所说的变量名) 二:存储类别 (1)静态存储类别:静态存数类别变量(我们简称静态变量),从程序的开始处就存在,其生命期伴随整个程序. (2)自动存储类别:当变量时自动存储类别时,变量在进入到定义它们的程序快时定义它,在离开它们所在的程序块(作用域)时销毁它,因此成为自动变量.其中关键字auto和register用来声明自动类型的变量, 三:自

转:C语言中的static变量和C++静态数据成员(static member)

转自:C语言中的static变量和C++静态数据成员(static member) C语言中static的变量:1).static局部变量        a.静态局部变量在函数内定义,生存期为整个程序运行期间,但作用域与自动变量相同,只能在定义该变量的函数内使用.退出该函数后, 尽管该变量还继续存在,但不能使用它.        b.对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值.而对自动变量不赋初值,则其值是不定的.2).static全局变量        全局变量本身就是静

变量的存储小结

变量是C语言最基础也是最核心的概念,对于初学C语言的同学来说变量的存储总是觉得比较混乱.这里对C的变量做一个简单的小结,希望对大家有所帮助. 我们看到对变量的讲解的时候看到很多概念,属性,存储期,内部链接,外部链接,空链接,全局变量,局部变量,寄存器变量,静态变量等等.看起来很混乱,下面我们梳理一下. 其实我们再使用变量的时候大多关心的只有三个方面:变量的存在期,变量的类型,变量的作用域. 我们想一下变量的定义方法分为三部分: <存储类别>  <变量的数据类型>   <变量名

变量的存储类别

全局变量和局部变量 在函数之外定义的变量称为外部变量,也是全局变量:在函数内部定义的变量称为局部变量,它只在本函数范围内有效.全局变量在程序的全部执行过程都占用存储单元,而局部变量只是在调用到该函数的时候才回去动态的给局部变量分配内存空间. 从 变量的作用域角度来分,可以分为全局变量(生命周期是该文件开始到结束)和局部变量(离开该方法或者复合语句就无效):从变量值存在的时间即生命周期来分可以分为 静态存储方式和动态存储方式. 所谓静态存储方式是指在程序运行期间有系统分配指定的存储空间的方式,而动

前端学PHP之变量、数据类型及作用域

目录 [1]变量 变量定义 变量赋值 [2]数据类型 字符串 整数 浮点数 布尔型 数组 对象 NULL 资源 [3]作用域 global static 变量 变量定义 变量是存储信息的容器,以$符号开头,其后是变量名称.变量名称必须以字母或下划线开头,对大小写敏感 <?php $x=5; //5 echo $x; //什么都不输出 echo $X; ?> 变量赋值 PHP没有创建变量的命令,变量会在首次为其赋值时被创建 <?php $txt="Hello world!&quo

编译器架构的王者LLVM——(10)变量的存储与读取

LLVM平台,短短几年间,改变了众多编程语言的走向,也催生了一大批具有特色的编程语言的出现,不愧为编译器架构的王者,也荣获2012年ACM软件系统奖 -- 题记 版权声明:本文为 西风逍遥游 原创文章,转载请注明出处 西风世界 http://blog.csdn.net/xfxyy_sxfancy 变量的存储与读取 变量是一款编程语言中的核心,说编译语言是一种符号处理工具,其实是有些道理的.栈式符号表可以方便的记录编译过程中的变量和语法符号,我们上节已经了解了其中的实现方法.那么,还有没有其他的办