变量的存储类型与变量的生存期

在C语言中,每一个变量和函数都有两个属性:数据类型数据存储类型

 

数据类型:int 、long、short、char、float、double,以及对应的指针类型;

数据的存储类型

        可以划分两大类型:静态存储类型动态存储类型

        具体包括:自动的(auto)、静态的(static)、外部的(extern)、和寄存器的(register)

自动变量

         在函数中定义的局部变量,如果没有进行专门的说明,对它们的存储空间的分配和释放工作,均有操作系统自动处理,这类局部变量称为自动变量。自动变量用关键词 auto 作为存储类型。定义的数据在栈区(动态存储区)

 静态变量

有时希望函数中的局部变量的值在调用结束后不消失,继续保持原值,即其占用的存储单元不释放,在下一次再调用该函数时,该变量为上次函数调用结束的值。这时就应该指定该局部变量为“静态局部变量”。

如果在定义局部变量时不赋初值,则对于静态局部变量来说,编译时自动赋初值0(对于数值型变量)或  ‘\0’(对于字符变量)

虽然静态局部变量在函数调用结束后仍然存在但其他函数是不能引用它的。因为它是局部变量,只能被本函数引用,而不能被其他函数引用。

        静态变量声明:

        static 类型 变量名列表;

        例如: static int a,b,c;

        声明 a、b、c为静态存储类型的变量。

静态变量又可以划分为静态局部变量和静态全局变量定义的数据存储在内存的静态区

        如果程序设计中希望某些外部变量只限于被本文件引用,而不能被其他文件引用。这是可以在定义外部变量时加一个 static 声明;

        加上 static 声明后,只能用于本文件的外部变量叫静态外部变量。 

 

        用static 声明的函数为内部函数,只能本文件内的函数调用,其他文件的函数不能调用。该函数称为 “内部函数”,若 函数没有用static 声明则,该函数为 “外部函数” 可以被其他文件的函数调用

在需要调用其他文件的函数时,需要对 想要调用的函数进行声明(可省略)

 

寄存器变量

        寄存器存储类型:将相关变量的值存储在CPU的通用寄存器中;

        由于计算机的运算器和通用寄存器均集成在CPU的内部,因此,数据读写时间比内存块的多,一般快一个数量级以上;

        但CPU内部的寄存器优先,不可能定义太多寄存器变量。一般定义几个循环变量;

        当寄存器用完,定义成寄存器存储类型的变量会自动转变成普通变量。

寄存器变量的定义方式:

        register 类型 变量列表;

        例如: register int i,j,k;

        定义了 i、j、k三个整型的寄存器变量。

 

全局变量(外部变量)

全局变量都是存放在静态存储区中的。因此它们的生存期是固定的,存在于程序的整个运行过程。

如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件结束。在定义点之前的函数不能引用该外部变量。

如果在定义点之前的函数需要引用该外部变量,则应该在引用之前用关键字 ‘extern’对该变量作 “外部变量声明”。

    外部变量声明格式:

        extern 类型 变量列表;

        例如: extern float x、y;

        C语言允许一个程序分成若干个文件,也就是一个程序写在几个文件中,每一个文件可以单独编译成二进制代码文件(目标文件);

        然后在连接时把它们拼成一个可执行程序。

系统在编译过程中遇到extern时:

        1、现在本文件中找外部变量的定义,如果找到,就在本文件中扩展作用域;

        2、如果找不到,就在连接时从其他文件中找外部变量的定义。如果从其他文件中找到了,就将作用域扩展到本文件;

        3、如果再找不到,就按出错处理。

外部变量有:同一文件的外部变量、不同文件的外部变量。

        同一文件的外部变量:

        C语言要求 ”先声明、后引用“;

        也就是所以变量在引用之前必须已经声明;如果在一个文件内,声明在后,则需要在引用之前声明为外部变量。

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值