C primer plus 第12章 存储类别、链接和内存管理(全局变量、静态变量局部变量和常量)

存储类别:

对象:从硬件方面来看,被储存的每个值都占用一定的物理内存,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指针
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值