您好, 访客   登录/注册

关于C语言中变量的探讨

来源:用户上传      作者: 王 宁

  摘 要: 在所有的计算机高级语言中,都存在着变量这样一个重要的概念。变量是计算机高级语言程序的重要成分之一。与其他语言中的变量相比,C语言中的变量所包含的内容更为丰富,包括变量的定义、数据类型、变量数据类型的转换、作用域、存储类别和存储方式等。
  关键词: C语言 变量 变量的存储类别
  
  C语言是一种应用广泛的、结构化的程序设计语言。程序设计的一项主要任务就是对数据进行处理,编写程序时需要用到各种变量来存放数据。因此,变量在C语言中是一个很重要的概念。由于C语言的数据结构丰富,变量的内容也很多,包括变量的概念、定义、数据类型、作用域、存储类别和存储方式等。灵活掌握C语言中的各种变量,对程序设计将起到至关重要的作用。
  一、变量的概念
  变量是内存或寄存器中用一个标识符命名的存储单元,可以用来存储一个特定类型的数据,并且数据的值在程序运行过程中可以进行修改。可见,变量首先是一个标识符或者名称,就像一个客房的编号一样,有了这个编号,我们就可以找到房间的客人。为了方便,我们在给变量命名时,最好能符合大多数人的习惯,应见名知义,便于交流和维护。
  二、变量的定义和初始化
  在C语言中要使用变量必须先定义,再使用。一个变量定义的完整格式是(里的部分表示可以省略的部分):
  [存储类型]数据类型 变量名1[=表达式1],变量名2[=表达式2],……,变量名n[=表达式n]。
  定义一个变量的过程就是向内存申请一个符合该数据类型的内存空间,以后对该变量的操作就是对对应内存空间的存取操作。
  在这个定义中,存储类型决定了变量存放在何处,数据类型决定了这个变量所占的字节数,变量名决定了这个变量在本程序中的名字,表达式则决定了这个变量的初始值,使用变量之前应该给一个值,编译程序将帮助我们发现那些还没有被给定一个值就被使用的变量。不过,变量不一定需要初始化。在函数外部定义的变量或者在函数内部用static关键字定义的变量在没有明确地被初始化之前都已被系统初始化为0了。在函数内部或程序块内部定义的不带Static关键字的变量都是自动变量,如果没有明确地对这些变量进行初始化,它们就是会具有未定义值。如果没有对一个自动变量进行初始化,在使用它之前就必须保证先给它赋值。
  三、变量的数据类型
  程序设计最基本的问题是解决对所要处理数据的描述。任何一个数据,都有一个确定的表示形式。一个确定的值和确定的能参与的各种运算,就是数据类型。程序中变量的本质表现在存在时间和占用空间这两个方面。变量的数据类型决定了变量占用的存储空间。它受类型说明语句的制约。任一变量都必须具有确定的数据类型。不管变量怎样变化,其值都必须符合该类数据类型的规定。
  四、变量的存储类型
  C语言中变量不仅仅有数据类型,还有存储类型。数据类型用来说明变量所占的存储空间的大小和可以进行的操作,存储类型用来表示变量的生命期和作用域,即变量起作用的范围。在C语言中,按照变量的作用域把变量分为两种:局部变量和全局变量。
  1.局部变量
  在一个函数内部定义的变量,只在本函数内部有效,这种变量称为“局部变量”。例如:主函数与被调用函数中可以有相同的变量名,但这些变量只作用在它自己的范围内,即两个函数中的同名变量,在内存中占有不同的存储单元,是两个不同的变量。局部变量存在于以下几种形式中:
  (1)在一个函数内部定义的变量是局部变量,只能在函数内部使用。
  (2)在主函数内部定义的变量也是局部变量,其它函数也不能使用主函数中的变量。
  (3)形式参数是局部变量。
  (4)在复合语句中定义的变量是局部于复合语句的变量,只能在复合语句中使用。
  (5)局部变量在函数被调用的过程中占有存储单元。
  (6)不同函数中可以使用同名变量。在不同的作用域内,可以对变量重新进行定义。
  2.全局变量
  在函数外部定义的变量是全局变量,其作用域是变量定义位置至整个程序文件结束。使用全局变量,可增加函数间数据联系的渠道。全局变量可以将数据带入到作用域范围内的函数,也可以将数据带回到作用域范围内的其它函数。提前引用外部变量,需对外部变量进行说明,或称声明。局部变量如与外部变量同名,则在局部变量的作用域内,外部变量存在,但不可见,外部变量的作用被屏蔽。全局变量在程序运行过程中均占用存储单元。在编程时,原则上尽量少用全局变量,能用局部变量,不用全局变量,要避免局部变量全局化。
  在C语言中,按照变量在内存中存在的时间(生存期)角度来分,可分为动态存储方式和静态存储方式。
  (1)静态存储变量
  凡是用关键字Static定义的变量全部被称为静态变量。所有的静态变量全部存储在静态存储区,在程序的运行期间一直存在。
  (2)动态存储变量
  动态存储变量是存储在动态存储区的,这种变量只在定义它们的时候才创建,在定义它们的函数返回时系统回收变量所占内存。对这些变量的创建和回收是由系统自动完成的,所以也叫自动变量(用关键字Auto定义)。最典型的例子就是函数中定义的局部变量。
  变量的特性除了数据类型之外,还有存储类别。C语言中变量的存储类别有四种:自动型(Auto)、静态型(Static)、外部型(Extern)、寄存器型(Register)。
  ①自动型(Auto)
  Auto表示自动变量,通常关键字Auto可以省略,自动变量必须定义在函数内部,我们以前所说的变量基本上都是这种类型,函数的形式参数也是这种类型。自动型变量是局部变量,所以作用域是本函数。若是在复合语句中说明的自动变量,其作用域是本复合语句。
  ②静态型(Static)
  在函数内部以Static进行说明的变量。它是局部变量,作用域与自动变量相同。它的存储方式是静态的,当它被说明后就占有存储单元,直到本程序执行结束,所以它的生命期是从被说明开始到程序执行结束。当一个变量被定义为静态型时,如果它没有赋值,系统自动赋0值,而自动变量不赋值,它的值是不确定的。
  ③外部型(Extern)
  在函数外部说明的变量,它是全局变量,所以作用域是从说明开始到程序结束。它的存储方式是静态型,所以它的生存期是从说明开始到整个程序执行结束。外部变量有定义性说明和引用性说明两种形式,定义性说明作用是定义一个外部变量,不需要使用Extern。若外部变量在程序的后面说明,当前不能直接使用,若要使用就必需使用Extern进行引用性说明。
  ④寄存器型(Register)
  Register关键字用于声明寄存器变量,频繁使用的变量声明为Register型可以提高程序效率,也可以交给编译器自行优化(编译器一般把循环控制变量存储类型定为Register),Register类型的变量受处理器寄存器长度的限制,不符合要求的Register变量将会被处理成Auto型内存变量。Register变量在作用时驻留于处理器的寄存器,故其作用域也只限于相应的函数和复合语句,和Auto类似。
  总之,C语言中的变量类型丰富,运用灵活。只有多想、多练、多编写程序,我们才能真正掌握其中的含义。
  
  参考文献:
  [1]谭浩强.C程序设计.北京:清华大学出版社,2002.8.
  [2]王煜等.C语言程序设计.中国铁道出版社,2005.2.


转载注明来源:https://www.xzbu.com/9/view-977962.htm