0%

C语言变量

C语言的基本数据类型占用的字节数与编译器和操作系统位数都有关,如int型在32位操作系统下和64位操作系统斗都占4个字节,char *即char类型的指针在32位下占4字节,64位下占8字节。

一、基础

  1. 变量是指在程序运行过程中其值可以改变的量,程序中使用的变量名是用户根据需要而取名的,变量名必须符合标识符的命名规则。
  2. 变量的作用域是指一个变量能够起作用的程序范围,如果一个变量在某个文件或函数范围内有效,则称该文件或函数为变量的作用域,在此作用域内可以引用此变量。根据作用域的不同,变量可分为两种类型,即局部变量和全局变量。
  3. 变量的生存期是指一个变量存在时间的长短。即从给变量分配内存,到所分配的内存被系统释放的时间。如果一个变量在某一时刻是存在的,则认为这一时刻属于该变量的“生存期”。
  4. 分类
    • 局部变量:在一个函数内部定义的变量称为内部变量,它只在本函数范围内有效,也就是说只有本函数才能使用它们,在此函数外是不能使用这些变量的,也称局部变量。
    • 全局变量:在函数内部定义的变量称为局部变量,在函数外部定义的变量称为全局变量。全局变量可以为本C程序中其他函数使用,它的有效范围是从定义变量的位置到程序结束。

二、变量存储类别

  1. 在C语言中,供用户使用的存储空间分为三类:程序区、静态存储区、动态存储区。其中,程序区存放的是可执行程序的机器指令;静态存放区存储的是在程序运行过程中需要占用固定存储单元的变量,如全局变量;动态存储区存放的是在程序运行过程中根据需要动态分配内存空间的变量,如形式参数、局部变量。
  2. 变量的存储类别指的是数据在内存中存储的方式,主要分为两类:静态存储类和动态存储类,具体包含4种:自动型(auto)、静态型(static)、寄存器型(register)和外部型(extern)。
  3. 分类
    • 局部变量的存储方式:自动型、静态型、寄存器型。
      • 自动变量:函数中的局部变量,如果不特别声明为static存储类别,都是动态地分配存储空间,数据存储在动态存储区中。
      • 静态变量:自动变量在函数调用结束后其所占用的内存空间会被释放,有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,即其占用的内存空间不被释放,在下一次函数调用时,该变量已有值,这时就可以声明局部变量为静态局部变量,用关键字static进行声明。
        • 局部静态变量是在静态存储区分配存储单元的,在整个程序运行期间都不释放。因此在函数调用结束后,它的值并不消失。
        • 局部静态变量是在程序编译过程中被赋值的,且只赋值一次,在程序运行时其初值已经确定,以后每次调用函数时不再赋值,而是保留上一次函数调用结束时的值。
        • 局部静态变量的初值为0(对整型变量)或空字符(对字符型变量)。
        • 虽然静态局部变量在函数调用结束后仍然存在,但是其他函数是不能引用它的。
        • 由于静态局部变量占内存多(长期占用不释放,不能像动态存储那样一个存储单元可以供多个变量使用),而且由于其值可以改变,不能弄清楚局部静态变量的当前值是多少,降低了程序的可读性,因此不建议过多地使用局部静态变量。
      • 寄存器变量:一般情况下,变量的值是存放在内存中的。当程序中用到哪一个变量的时候,控制器发出指令将内存中该变量的值送到运算器中。但如果一些变量运用频繁,那么从内存中读取数据要消耗很多时间,为了提高程序的运行速度,C语言中允许将局部变量的值放在CPU中的寄存器中,需要时直接从寄存器中读取数据,不必再到内存中读取数据。这种变量称为寄存器变量,用关键字register声明。
        • 只有局部自动变量和形式参数可以作为寄存器变量,其他类型的变量是不可以的(局部静态变量不能定义为寄存器变量)。
    • 全局变量的存储方式:外部类型、静态类型,在静态存储区中分配内存单元。
      • 外部全局变量:全局变量是在函数的外部定义的,它的作用域是从变量的定义处开始到本程序文件的结束。如果在定义点之前的函数想要引用该变量,则应该在引用之前用关键字extern对该变量进行声明,声明该变量为外部全局变量。声明过后,就可以从声明处起,合法地使用该变量。
        • 一个C程序可能由一个或多个源程序文件构成。如果程序由多个源程序文件组成,在一个文件中引用另一个文件中定义的全局变量,需要用extern关键字对全局变量做外部全局变量声明。
        • extern不能用来初始化变量,即extern int a=3是不正确的。
        • 使用extern的作用是扩展全局变量的作用域。
        • 在系统编译遇到extern时,先在本文件中寻找全局变量的定义,如果找不到,在连接时从其他文件中寻找全局变量的定义。
        • 在不同文件中引用全局变量时,因为全局变量的值可能会被改变,因此在使用时要特别注意。
      • 静态全局变量:在设计一个程序时,有时不希望某些全局变量被其他文件引用,这时可以用关键字static对全局变量进行声明。
        • 使用static声明全局变量,可以避免文件中的一些全局变量被其他文件引用。
        • 无论是否对全局变量进行static声明,全局变量均是静态存储方式。
        • 使用static声明的全局变量,在本文件中定义在全局变量之前的函数也是不能引用的。

三、数据类型

  1. 在C语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。
  2. 分类
数据类型 说明
基本类型 包含short/int/long/float/double/char六种
构造类型 包含数组、结构体struct、共同体union、枚举类型enum四种
指针类型 一个特殊的类型,存储的数值被解释成为内存里的一个地址
空类型void 无类型,可限定函数的参数或返回值为空

四、参考