C变量及函数存储类型

C变量及函数存储类型

  1. 变量及函数声明格式 在C语言中,对于一个变量的声明/定义格式如下:存储类型 类型修饰 数据类型 变量名 其中:
  • 数据类型用来指明变量的存储大小,即一个该类型的变量占用了多大的内存空间。数据类型包括基本数据类型(char,double、int、float 以及指针类型)和基本类型组合后的用户自定义数据类型(struct、enum、typedef 和 union)。
  • 类型修饰符用来修饰变量的存储及表现方式。包括long、short、signed、unsigned、void、const、volatile 等。
  • 存储类型用来指明变量的存储位置,常见的存储类型有auto、extern、register、static,即在运行该变量在哪一个段分配内存空间。如前所述,在一段执行程序中,可以为变量分配存储空间的有BSS区、数据区、栈区、堆区。在C语言中,对于一个函数的声明格式如下:存储类型 返回数据类型 函数名(参数列表)其中:
  • 函数名即该函数的标志符。
  • 返回数据类型是该函数退出时返回给调用函数的数据的数据类型。
  • 存储类型用来标识该函数的作用域,而不是存储位置 ,主要有extern和static两个,auto和register不用来标识程序的存储类型。
  1. auto存储类型
    auto 只能用来标识变量的存储类型,意义为自动类型,标识该局部变量存储在正在运行的进程栈区域,一般情况,对于局部变量,auto 为默认的存储类型,不需要显示指定。局部变量的作用域为其所在的一对{}内,生存周期为创建函数到函数结束。局部变量如果没有初始化而直接参与计算,系统将会为其分配一个随机值,当然,使用是不安全的。
  2. 全局变量及extern声明的数据
    extern关键字既可以标识变量,又可以标识函数。对于变量来说,extern用来声明,在当前文件中引用()使用,而在当前项目中的其他文件中定义的全局变量。因为已经初始化全局变量被存储在数据区,所以声明其他文件中的全局变量将不再为其分配内存空间。在这里简单对声明和定义变量做一个说明。定义一个变量:告诉编译器需要为该变量分配空间。声明一个变量 :告诉编译器需要使用该变量,但该变量在其他位置被定义。声明全局变量可以使用以下两种方式。
    (1)如果该全局变量在头文件中定义,则在需要使用该变量的文件中包含相应的头文件即可,但如果多个文件都引用此头文件,且这些文件将一起编译进一个项目中,如果该全局变量被初始化了,则有可能造成重复定义(在GCC环境下,在一个头文件中定义某全局变量但不初始化,其被多个文件包含的情况是允许的)。因此,这种方式一般不建议将全局变量定义在头文件中。
    (2)如果该全局变量在其他文件中定义(*.c),则在当前文件中使用extern声明。
    全局变量的作用域是整个项目的所有文件,但是,要使用在其它文件中定义的全局变量,则需要包含头文件或者extern关键字,否则只能在定义它的文件中被使用。
    全局变量和静态变量只能被初始化一次,在有些编译环境或者开发环境中,如果程序中没有初始化该变量,在编译时将自动为其赋初值为0
    对于函数来说,存储类型仅仅标识函数的作用域,默认的存储方式为extern。也就是说,在一个项目中,如果没有声明函数的存储类型,该函数可以被当前项目中的所有文件引用。
  3. register存储类型
    register关键字只能用于局部变量。定义存储类型为register的变量只能是整形和字符型,此关键字主要用于表示长期被使用的变量。在运行程序时,所有的数据都将调入到CPU寄存器中才能真正处理(通过汇编语言可以很好地了解这一原理),而由于CPU寄存器数量有限,普通的变量存储在内存单元中,只有在使用时才被加载到CPU的寄存器中,使用完马上清除掉。而定义register的变量常驻CPU的寄存器。
    从内存加载某个数据到CPU寄存器中至少需要一个指令周期,因访问register的变量将在很大程度上提高效率,故寄存器变量被用于循环控制是比较理想的。但是,一个程序中不允许定义太多的寄存器变量,因为CPU的寄存器数量是有限的。
    和auto类型数据一样,未初始化的寄存器变量将被随机分配一个初值。另外,使用register类型的局部变量的情况越来越少。
  4. static存储类型
    static意为静态的,既可以标识变量,也可以标识函数。被定义为静态类型的变量(无论是全局变量还是局部变量)存储在数据区,其生命周期为整个程序。如果是静态局部变量,其作用域为自身所处的一对{}内,如果是静态全局变量,其作用域为当前文件。
    静态变量如果没有初始化,将自动初始化为0。静态变量只会被初始化一次,如下图所示:
    在求和函数sum里面c是auto变量,根据auto变量特性可知,每次调用sum函数时变量c都会自动赋值0.b是static变量,根据static变量特性可知,每次调用sum函数时变量b都会使用上次调用sum函数时b保存的值。
    另外,被定义为静态类型的函数的作用域只能是当前文件,因此不能在项目的其他文件中被调用。将不需要在其他文件中调用的函数声明为static类型很有必要,这将在一定程度上避免函数名称的冲突。
  5. 常量数据
    字符串常量存储在代码段,其生存周期为整个程序运行期间。
    字符串的生存周期为整个程序的运行时间,但作用域为当前文件。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值