存储类别 您所在的位置:网站首页 移动硬盘不见了变成了未初始化 存储类别

存储类别

2023-03-09 06:25| 来源: 网络整理| 查看: 265

前面的运算符那篇文章提到过相关内容,C提供了不同的存储类别在内存中存储数据,C把存储值的数据存储区叫做对象,不同于面向对象的编程语言,如JAVA中的类,其定义包括数据和允许对数据进行的操作,而C中的对象你可以从硬件方面理解成存储C数据的一块内存。C对象可能并未存储实际的值,但是它在存储适当的值时一定具有相对应的大小。

从软件方面(即你编写的C程序)来看,程序需要一种方法访问对象,如通过声明变量来完成:​​int entity = 1;​​​,声明了一个名称为entity的标识符,标识符指定的对象内容是1;也可以通过​​int *pt = &entity;​​,pt是一个标识符,它指定了一个存储地址的对象,但是表达式*pt不是一个标识符,标识符的命名规则中也不能出现*,然而,它确实指定了一个对象,且与entity指定的对象相同。标识符entity是一个左值,表达式*pt也是一个左值,综上,左值是用于标识或定位存储位置的标签,左值能够指定特定内存位置的值,而可修改的左值则是能够改变对象中的值,复习一下前面说的内容,赋值运算符的左侧只能够是可修改的左值,右值即表达式的值。

可以用存储期描述对象,所谓存储期是指对象在内存中保留了多长时间。标识符用于访问对象,可以用作用域和链接描述标识符,标识符的作用域和链接表明了程序中的哪些部分可以使用它。而不同的存储类别具有不同的存储期、作用域和链接。

1.作用域

作用域描述程序中可访问标识符的区域。一个C标识符的作用域可以是块作用域、函数作用域、函数原型作用域或文件作用域。块是指用一对花括号括起来的代码区域,定义在块中的变量具有块作用域,也就是只能在该块中从定义处到块结束处使用;函数作用域与块作用域类似,函数作用域内声明的变量,不能被外部函数使用;函数原型作用域是从形参到原型声明结束,所以函数原型中如果有形参标识符,也不必与函数定义中的形参标识符相同;文件作用域的变量声明在函数的外部,作用单位是在它定义处到文件末尾。

2.链接

C标识符有3中链接属性:外部链接、内部链接或无链接。具有块作用域、函数作用域或函数原型作用域的都是无链接变量,这意味着这些变量属于定义它们的块、函数或原型所有。具有文件作用域的变量可以是外部链接或内部链接,外部链接变量可以在多个文件程序中使用,内部链接变量只能在一个翻译单元(即一个源代码文件和它所包含的头文件)中使用。一般”内部链接的文件作用域“被简称为”文件作用域“,”外部链接的文件作用域“被简称为”全局作用域“或”程序作用域“。区分文件作用域是内部链接还是外部链接,看外部定义中是否使用了static存储类别说明符,使用static修饰则是内部链接文件作用域,使用extern存储类别说明符或者不使用,则是外部链接的文件作用域,这种变量也叫做全局变量。

3.存储期

作用域和链接描述了标识符的可见性。存储期描述了通过这些标识符访问的对象的生存期。C对象有四种存储期:静态存储期、线程存储期、自动存储期、动态分配存储期。

如果对象具有静态存储期,那么它在程序的执行期间一直存在。文件作用域变量以及static存储类别说明符修饰的变量都具有静态存储期,如果static修饰的是文件作用域变量那么只表明了其链接属性,而非存储期。

线程存储期用于并发程序设计,程序可被分为多个线程。具有线程存储期的对象,从被声明时到线程结束一直存在。以关键字_Thread_local声明一个对象时,每个线程都获得该变量的私有备份。

块作用域的变量通常都具有自动存储期。当程序进入定义这些变量的块时,为这些变量分配内存,当退出这个块时,释放刚才为变量分配的内存。但变长数组稍有不同,它们的存储期从声明处到块的末尾,而不是从块的开始到块的末尾。

4.存储类别

C中有四种存储类别:自动、寄存器、静态、外部;有五个关键字作为存储类别说明符:auto,register,static,extern,_Thread_local,typedef。typedef关键字与任何内存存储无关,只是由于一些语法原因将其归为此类。在绝大多数情况下,不能在声明中使用多个存储类别说明符,所以不能使用多个存储类别说明符作为typedef的一部分,唯一例外的是_Thread_local,它可以和static或extern一起使用。

存储类别

存储期

作用域

链接

声明方式

自动

自动

块内

寄存器

自动

块内,使用关键字register

静态

静态

文件/块

内部/无

函数外/块内,使用关键字static

外部

静态

文件

外部

函数外,使用关键字static

4.1自动变量

默认情况下,声明在块内或函数头中的任何变量都属于自动存储类别。为了更清楚的表达你的意图,例如,为了表明有意覆盖一个外部变量的定义,或者强调不要把该变量变为其他存储类别,可以显示使用关键字auto。注意,auto关键字在C++中的用法完全不同,如果编写C/C++兼容的程序,最好不要使用auto作为存储类别说明符。

块作用域和无链接意味着只有在变量定义所在的块中才能通过变量名访问该变量,或者通过间接的方式,将其地址作为参数传递;故另一个函数可以使用同名变量,因为它们存储在内存的不同位置。自动存储期意味着,程序进入变量所在块时变量存在,当退出该块时变量消失。原来自动变量占用的内存可作他用。

#include

int main(void){ int n = 4; printf("n:%d\n", n); for(int n = 1; n



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有