C程序访问内存的方法、 存储类型(存储类别)、存储期、对象、左值
1. 什么是存储类型?
即C语言程序在内存中存储数据的存储类别,C语言有多种不同的存储类别。
2. 什么是对象?
从硬件角度上看,被存储的每个值都占用一定的物理内存,C语言把这样的一块内存称为对象。
3. 程序访问对象(内存)的方法:
通过声明变量实现,创建标识符,标识符可以指定特定对象的内容。标识符是一个名称,在这种情况下,标识符可以用来指定(designate)特定对象的内容。
举例:
int data_object;
声明了一个名称叫 data_object 的标识符,这个标识符是一个变量。可以指定特定(分配的内存位置)对象的内容。
!!标识符不是指定对象的唯一途径,还可以使用指针。
*pt 不是标识符,但是可以指定对象。
int data_object = 10;
int *pt = & data_object;
int array[520];
pt 是一个标识符,它指定了一个存储地址的对象(占用物理内存)。
但是,表达式*pt不是标识符,但是它可以指向data_object的对象。
数组的每一个元素也是对象。
4. 什么是表达式?
由运算符和运算对象组成,运算符可以为空,每个表达式都有一个值
5. 什么是左值?
那些可以指定对象的表达式被称为左值。
说明:变量既是标识符也是左值。
举例:
data_object 既是标识符也是左值。
*pt 不是标识符,是表达式也是左值。
pt 是标识符,不是表达式也不是左值。
array + 10* data_object 是表达式,不是左值(不指定内存位置里存放的内容),不是标识符。
*(array + 10 data_object)是表达式,是左值,不是标识符。
什么是可修改的左值?
可以使用左值修改对象中(内存中)的值,就是这个变量名在 “=”左边,可以通过右侧的表达式给左边的变量赋值。
6. 什么是存储期
作用域和链接描述了标识符的可见性(程序的哪些部分可以使用该标识符)。
存储期描述了(通过)标识符访问的对象的生存期,就是指对象在内存中保留了多长时间,可以认为存储期就是生存期。
C的对象有4种存储期:
静态存储期、线程存储期、自动存储期、动态分配存储期
(1)静态存储期:对象在程序执行期间一直存在
举例:文件作用域变量,
(2)线程存储期:从声明开始到线程结束一直存在
举例:并发程序设计中具有线程存储期的对象
(3)自动存储期:进入代码块时分配内存,代码块结束时释放内存。
举例:局部变量
(4)动态分配存储期:
调用malloc时分配内存,调用free函数时释放内存
7.什么是存储类别
存储类别: 变量的存储类型是指存储变量值的内存类型!
变量的存储类型决定其何时创建,何时销毁,值保持多久。内存中存储变量的地方包括:普通内存、运行时的堆栈、硬件寄存器。
①自动 存储于堆栈中(代码块内部声明的变量)
②静态 存储于静态存储区 (被static修饰过的变量),函数形参不能声明为静态。
包括:
(1)块作用域的静态变量,
(2)内部链接的静态变量(被static修饰的文件作用域变量(全局变量))
(3)外部链接的静态变量,一般叫做外部变量,不然读起来容易有歧义,且容易混淆(被extern(可缺省)修饰的文件作用域变量(全局变量))。
③寄存器 存储于机器的硬件寄存器 访问效率更高,容量有限,地址不可被获取。
存储类别说明符
C语言中,存储类别说明符包括:
auto、static、extern、register、_Thread_local和typedef
(1) auto 说明符修饰变量表明变量是自动存储期,只能用于块作用域变量声明中,一般缺省。
(2) static 说明符修饰变量表明变量是静态存储期。
(3)extern 说明符表明声明的变量定义在别处。
(4)register 说明符只能用于修饰块作用域变量,将变量放在寄存器存储,可以以更快的速度访问该变量,且地址不能被获取。
(5)_Thread_local 以该关键字创建的对象具有线程存储期,即在线程中声明的对象,在该线程运行期间一直存在。该对象属于线程私有!
(6)typedef 与存储无关,主要是工程使用原因将其归为存储类别说明符