• 软件:1160
  • 资讯:41601|
  • 收录网站:97880|

IT精英团

C语言基础知识——存储类

C语言基础知识——存储类

浏览次数:
评论次数:
编辑: 景同
信息来源: 51CTO博客
更新日期: 2021-06-11 01:10:06
摘要

C语言基础知识——存储类别,##1、存储类别C提供了许多不同的模型和存储类别在内存中存储数据###(1)对象用于存储值的数据存储区域一个对象可以存储一个或多个值一个对象可能并未存储实际的值,但在存储适当的值的时候,一定具有相应的大小(未初始化的声明)###(2)声明创建一个标识符,与特定的对象相关联,并可以用来指定特定对象中的内容```Cinta=10;//创建了一个标识符a,关联

  • 资讯详情
## 1,存储类别 c提供了许多不同的模型和存储类别来将数据存储在内存中 ### (1)对象 用于存储值的数据存储区 一个对象可以存储一个或多个值 对象可能不存储实际值,但是当它存储适当的值时,它必须具有相应的大小(未初始化的声明) ### (2)声明 创建与特定对象相关联的标识符,该标识符可用于指定特定对象中的内容 ` ` c int a=10//创建一个标识符A,与一个4字节的内存空间相关联,并指定该空间中的值 ``` ### (3)左值 指定对象的表达式 ` ` c int * pt=a;//pt本身是一个标识符,关联一个4字节的内存空间,赋一个值,这个值是左值; //*pt是一个表达式,它与a具有相同的内存空间,也是一个左值 ``` ### (4)储存期 用于描述一个对象,指对象在内存中保留的时间 ### (5)范围和链接 用于描述标识符,指示其在程序中的应用范围 ## 2.范围 描述程序中可以访问标识符的区域 C变量的作用域可以是:*块作用域*,*函数作用域*,*函数原型作用域*,*文件作用域* ### (1)块范围 块是由一对大括号包围的代码区域 块中定义的变量具有块范围,可见范围是从定义到包含定义的块的末尾 虽然函数的形式参数是在函数的左大括号之前声明的,但是它们也有块范围,属于定义它们的函数 ### (2)功能范围 仅goto语句的标签。即使一个标签第一次出现在一个函数的内部块中,它的范围也可以扩展到整个函数。因此,相同名称的goto标记不能在同一函数的不同内部块中使用 ### (3)原型功能范围 函数原型中使用的参数,从定义开始到函数原型声明结束。 ### (4)文件范围 变量是在函数外部定义的,并且有一个文件范围,从定义的开始到定义所在文件的结尾都可以看到 当用文件范围描述一个变量时,它的实际可见范围是整个翻译单元 *翻译单元*:源代码文件包含头文件和头文件中包含的其他头文件,被视为包含信息的单独文件 ## 3,链接 c变量有三个链接属性:*内部链接*,*外部链接*和*无链接* ### (1)没有链接变量 具有块范围、函数范围和函数原型范围的变量都是未链接的变量,它们属于定义它们的块、函数或函数原型 ### (2)内部链接 关键字**static**修改的文件范围变量只能在一个翻译单元中使用 ### (3)外部链接 具有文件范围的变量,可用于多文件程序 ## 4.储存期 范围和链接描述了标识符的可见性。 存储期描述了通过这些标识符访问的对象的生命周期。 ### (1)C对象有四个存储期 静态存储期、线程存储期、自动存储期和动态分配存储期 ### (2)静态储存期 就像一个对象有一个静态存储期一样,它的生命周期是:程序开始——程序结束。 文件范围的变量有一个静态存储期 ### (3)线程存储期 对于并发编程,程序执行可以分为多个线程。 从声明开始到线程结束,存在一个具有线程存储期的对象 当用关键字**_Thread_local**,声明一个对象时,每个线程都会得到该变量的私有备份 ### (4)自动储存期 块范围的变量通常有一个自动存储期 当程序进入定义变量的块时,为这些变量分配内存空间,并在退出后立即释放刚刚为变量分配的内存 ### (5)静态局部变量 块作用域的变量经过**static**,修改后也可以有一个静态存储期,从程序开始到结束都存在,但只有在它所在的块被执行时才会被访问 ` ` c 无效的乐趣(无效) { int索引; static int a=0;//局部变量a有一个静态存储期 } ``` ### (6)5个存储类别 |存储类别|存储期限|范围|链接|声明方法| |-|-|-|-|-| 自动|自动|块|无|在块内 | register| automatic | block | none |在block内,使用关键字register | |静态外部链接|静态|文件|外部|外部所有功能| |静态内部链接|静态|文件|内部|使用除所有函数之外的静态关键字| |静态无连接|静态|块|无|在块中,使用静态关键字| ## 5,自动变量 属于自动存储范畴,自动存储周期,块范围,无链接 默认情况下,在块或函数头中声明的任何变量都属于自动存储类别 使用关键字**auto**显式声明一个自动存储类别的变量 如果内部块中的变量与外部块中的变量同名,则内部块会隐藏外部块的定义。当程序离开内部块时,外部块变量的范围返回到原始范围 ` ` c { int x=10 { int x=123 printf('x=%d\n ',x);//输入的值将是123 } printf('x=%d\n ',x);//输入的值将是10 } ``` ### (1)不带大括号的块 C99特性作为loop或if语句的一部分,即使不使用{},也是一个块。 ### (2)自动变量的初始化 自动变量不是自动初始化的,只能显示初始化 ## 6,寄存器变量 在计算机中,CPU承担了大部分的计算任务,CPU的工作区域由几个寄存器组成 用关键字**register**声明的变量可以直接放入寄存器或最快可用内存中,是放入寄存器还是最快可用内存由编译器根据寄存器数量或最快可用内存确定 经过于寄存器无法被取地址,所以此类声明能保护变量不会被取地址 ## 7、块作用域的静态变量 ### (1)静态变量 “静态”的意思是在内存中原地不动 ### (2)静态局部变量 具有静态存储期、块作用域,无链接,在程序执行期间一直存在,但只有执行它所在的块的代码时,才会被访问 如果未被显式的初始化,它会自动初始化为0 ## 8、外部链接的静态变量——全局变量 ### (1)关键字**extern** 在使用定义在其它文件中的全局变量时,必须先使用extern再次声明 ### (2)初始化 可以被显式的初始化 如果未被显式初始化,则自动初始化为0 全局变量只能被初始化1次 ## 9、多文件 只有当程序由多个翻译单元组成时,才能体现区别内部链接和外部链接的重要性 ### (1)多文件共享一个变量 可以在一个文件中进行定义,在其他文件中通过extern引用声明,来使用同一个变量 ### (2)避免同名冲突 在外部变量的声明前添加static关键字,可以保证该变量只作用于一个翻译单元,避免与其它翻译单元中的同名外部变量发生冲突 ## 10、存储类别说明符 |名称|存储期|链接|应用| |-|-|-|-| |auto|自动存储期|无链接|只能修饰块作用域的变量声明,主要是为了区别同名的外部变量| |register|自动存储期|无链接|只能用于修饰块作用域的变量声明,请求编译器将变量存入寄存器| |static|静态存储期|无链接或内部链接|被修饰的变量在程序载入时创建对象,程序结束时对象消失| ## 11、存储类别和函数 函数也有存储类别,可以是外部函数或静态函数 ### (1)外部函数(默认) 可以被其它文件中的函数访问 ### (2)静态函数 被static修饰,只能用域其定义所在的文件,可以避免命名冲突 ## 12、存储类别的选择 “按需知道”原则:尽量在函数内部解决该函数的问题,只共享那些需要共享的变量
数百个关于协同、过程和线索的讲座
« 上一篇
返回列表
下一篇 »
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
你会是第一个来这里评论的人吗?
最近发布资讯
更多