c语言的声明分配存储空间吗,C语言变量的声明和空间的分配.docx

无论用什么语言编制的程序,都是为让计算机完成某一特定功能而编写的文本文件。这些文本文件是不能直接在机器上运行的,它们必须经过系统软件(包括编辑器和编译器)的输入并编译或汇编后,转换成二进制的可执行代码,才是计算机可以识别的机器语言。此时,程序就是一个包含二进制可执行代码文件的模块。当内核把二进制的可执行代码装入内存后,它由三部分组成:代码段、数据段、堆栈段。在线性地址的低地址字段是代码段,存放程序经编译后的可执行代码(程序文本)。在操作系统中,代码段是只读的,不能修改,所以,代码段的长度是不会改变的。在程序文本(代码段)的上方是数据段,用来存放程序的变量、字符串和其它数据。它分为初始化静态数据(data)和未初始化静态数据(BSS)。数据段的长度是可以改变的。程序可以修改其中的变量。在程序设计中,将其值可以改变的量称为变量。每一个变量在内存中都要占据一定的存储单元,因此,每一个变量也就会具有一定的存储属性。

从变量的作用域(空间)的角度来考虑变量的属性,可将变量分为全局变量和局部变量。

局部变量

局部变量是指在一个函数内部定义的变量,它只中本函数范围内有效。

说明:

1、在主函数中定义的变量只在主函数中有效,且主函数也不能使用其他函数中定义的变量

2、在不同函数中可以使用相同名字的变量,它们代表不同的变量,互不干扰;

3、形参也是局部变量,也只在对应的函数中有效,其他函数不能使用

4、在一函数内部,可在复合语句(有一个{}括起的一组语句)中定义变量,这些变量只在本复合语句中有效。

全局变量

程序的编译单位是源程序文件,一个源文件可以包含一个或若干个函数。在函数之外定义的变量称为外部变量(extern),也叫全局变量。全局变量的有效范围是从定义变量的位置开始到本源程序文件结束为止,其关键字extern可以省略。

说明:

1、在一个函数中既可以使用本函数中的局部变量,又可以使用有效的全局变量。

2、设置全局变量的作用是增加函数间数据联系的渠道。由于同一文件中的若干函数均能引用全局变量的值,因而若在一个函数中改变了全局变量的值,就能影响其他函数,相当于各函数有了直接的传递通道,即公共变量,从而可能从函数获得一个以上的返回值。

3、建议不在必要时不要使用全局变量,因为:

(1)全局变量在程序的整个执行过程中都占用存储单元;

(2)它将降低函数的通用性。因为函数执行时要依赖对应的全局变量

(3)降低了函数的独立性,从而降低了函数的内聚度,增加了函数间的耦合度。而结构化程序设计的基本原则是:应争取组成程序的各模块(在C语言中用函数实现)具有尽可能高的内聚度和尽可能低的耦合度。

(4)如果外部(全局变量)在文件开头定义,则其作用范围为整个文件;如果不在文件开头定义,则其作用范围为定义点到文件终了处。若在定义点前的函数想引用此外部变量,则应在该函数中用关键字extern对外部变量作说明。

(5)如果在同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量不起作用。

变量的生存周期

从变量存在的时间(生存期)的角度来考虑变量的属性,则可将变量分为动态存储变量和静态存储变量。在C语言中,每一个变量和函数都具有两个属性:类型和存储类别。类型即int、float等,存储类别指的是数据在内存中存储的方式(属性)。存储方式分为静态存储和动态存储两大类,但具体有四种:自动型(auto,即局部变量)、寄存器型(register)、静态型(static)、外部型(extern,其它文件中定义过的全局变量),其中,静态型和外部型变量为静态存储变量,自动型和寄存器型变量为动态存储变量。在定义变量时,应先说明存储类型,再说明数据类型,最后说明变量名。

因此,静态存储变量也分静态全局变量和静态局部变量,动态存储变量则都是局部的?静态存储变量是指在程序运行期间占据固定的内存单元的变量,包含全局(extern,当然extern可省)变量、静态全局变量(加static的全局变量)和局部静态变量(冠以关键字static的局部变量)。

1、对于全局变量,在程序开始执行时就给它分配内存单元,直到程序终结时才释放。它可由本文件和其它文件中的函数所引用。在其它文件中被引用时,应该在文件开头有一个extern说明(注意,此说明在函数外),说明在引用该变量的文件中出现的变量是一个已在其他文件中定义过的全局(外部)变量,本文件不必再为它分配内存单元。本来外部变量的作用域是从它的定义点到文件结束,但可以用extern说明将其作用域扩大到有extern说明的其它文件。但使用这样的全局变量是应十分慎重,因为在执行一个文件中的函数时,可能会改变该全局变量的值,从而会影响到另一文件中函数的执行结果。

2、对于静态外部(全局)变量,即冠以static的全局变量,也在编译时分配在静

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值