存储类别:
对象:从硬件方面来看,被储存的每个值都占用一定的物理内存,C语言把这样的一块内存称为对象。
指定对象的表达式被称为左值。
作用域:
1.块作用域
块是用一对花括号括起来的代码区域。
定义在块中的变量具有块作用域,块作用域的可见范围是从定义处到包含该定义的块的末尾。
函数的形参也具有块作用域。
2.函数作用域
仅用于goto语句的标签。意味着即使一个标签首次出现在函数的内层块中,它的作用域也延伸至整个函数。如果在两个块中使用相同的标签会产生混乱,标签的函数作用域防止了这样的事情发生。
3.函数原型作用域的范围是从形参定义到原型声明结束。
4.文件作用域,也称为全局变量。
链接:
1.外部链接:可以在多个文件程序中使用
2.内部链接:只能在一个翻译单元中使用
3.无链接:只能作用于块作用域、函数作用域或函数原型作用域的变量
存储期:
1.静态存储期
程序在编译时分配内存。
如果对象具有静态存储期,那么它在程序的执行期间一直存在。
文件作用域变量(关键字static表明具有内部链接属性,并非存储期)
2.线程存储期
线程存储期用于并发程序设计,程序执行可被分为多个线程。具有线程存储期的对象,从被声明时到线程结束一直存在。
3.块作用域变量通常都具有自动存储期。当程序进入定义这些变量的块时,为这些变量分配内存;当退出这个块时,释放刚才为变量分配的内存。
自动变量:
默认情况下,声明在块或者函数头中的任何变量都属于自动存储类别。
auto说明符表明变量是自动存储期
使用auto主要是为了明确表达要使用与外部变量同名的局部变量的意图
自动变量只在使用时才会占用内存,退出该块释放内存,一定要初始化。
内层块会隐藏外层块的定义。但是离开内层块后,外层块变量又回到原来的作用域。
寄存器变量:
寄存器变量储存在CPU的寄存器中,或者概括的说存储在最快的可用内存中。由于寄存器变量储存在寄存器而非内存中,所以无法获取寄存器变量的地址。
register int quick;
块作用域的静态变量
静态变量中静态的意思是该变量在内存中原地不动,并不是说它值不变。
具有文件作用域的变量自动具有静态存储期。
块作用域的静态变量具有块作用域、无链接,但是具有静态存储期。
int trystat()
{
static int stay = 1;//会记住原来的值,不会被初始化
}
外部链接的静态变量
外部链接的静态变量具有文件作用域、外部链接和静态存储期(全局变量)
把变量的定义性声明放在所有函数外面创建外部变量。
如果一个源代码文件变量定义在另一个源代码文件中,则必须用extern关键字声明。
如果未初始化外部变量,他会自动被初始化为0;
内部链接的静态变量
静态存储期、文件作用域和内部链接
在所有的函数外部用static定义的变量具有这种存储类别。
全局变量:
在同一个文件所有函数的外部声明的变量是外部变量,具有文件作用域,外部链接和静态存储期。
在此声明前加上关键字static,则声明变量具有文件作用域、内部链接和静态存储期。
如果在函数中用static声明一个变量,则该变量具有块作用域、无链接、静态存储期
存储类别和动态内存分配
静态存储类别所用内存数量在编译时确定,只要程序还在运行,就可以访问储存在该部分的数据。
该类别的变量在程序开始执行时被创建,在程序结束时被销毁。
自动存储类别的变量在程序进入变量块时存在,在程序离开时消失
动态分配的内存在调用malloc()或相关函数时存在,在调用free()后释放。动态内存一般比使用栈内存慢。
const类型限定符
常量指针
const float *pf;//pf指向一个float类型的const值
所以指针指向的值不可以改变,指针的指向可以改变
指针常量
float *const pt;//pt是一个const指针
指针指向的值可以改变,指针的指向不可以改变
应用:c++中的引用以及this指针