第12章 存储类、链接和内存管理

C有5种不同的存储模型、或称存储类

存储时期:变量在内存中保留的时间

作用域和链接:一起表明程序的哪些部分可以通过变量名来使用该变量。

 

作用域:描述了程序中可以访问一个标识符的一个或者多个区域

 

 

分类

描述

作用域

代码块作用域

在代码块定义的变量

函数原型作用域

从变量定义处一直到原型声明的末尾

文件作用域

一个在所有函数之外定义的变量

链接

外部链接

可以在一个多文件程序的任何地方使用

内部链接

可以在一个文件的任何地方使用

空链接

具有代码块作用于或者函数原型作用域的变量有空连接,意味着他们是由其定义所在代码块或者函数私有。

存储时期

静态存储时期

具有文件作用域的变量,变量的位置固定不变

自动存储时期

具有代码块作用域的变量

 

 

存储类

时期

作用域

链接

声明方式

自动

自动

代码块

代码块内

寄存器

自动

代码块

代码块内,使用关键字register

具有外部链接的静态

静态

文件

外部

所有函数之外

具有内部链接的静态

静态

文件

内部

所有函数之外,使用关键字static

空连接的静态

静态

代码块

代码块内,使用关键字static

 

自动变量

只有变量定义所在的代码块才可以通过名字访问该变量,程序进入包含变量的代码块时候,变量才开始存在。

最常见的存储类,就是日常在main或者函数中的,int n;可以在前面加存储类说明符auto来说明,例如 auto int n

 

寄存器变量

基本和自动变量相同,只是寄存器变量是多存放在一个寄存器里,而非内存中,所以无法获得寄存器变量的地址。声明一个寄存器类变量仅仅是一个请求,而非一条命令。

 

具有代码块作用域的静态变量(空链接的静态变量 )

这些变量和自动变量具有相同的作用域,但当包含这些变量的函数完成工作时,它们并不会消失。

 

具有外部连接的静态变量

把变量的定义声明放在所有函数之外,即创建了一个外部变量

在使用换这个外部变量的函数中通过使用extern关键字来再次声明他。

外部变量的作用域:从声明的位置开始到文件结尾为止。无static

外部变量将自动被赋初值0.

 

具有内部链接的静态变量

把变量的定义声明放在所有函数之外,但需要用存储类说明符static声明   

 

内存分配函数

函数

说明

例子

特性

Malloc()

Malloc(字节数)

Double *ptd;

Ptd=(double *)malloc(30 * sizeof(double));

返回那块内存第一个字节的地址

Calloc()

Calloc(单元数量,单元字节数)

Long *newmem;

Newmem=(long *)calloc(100,sizeof(long));

将块中全部为都设置为0

Free()

Free(指针)

Free(ptd)

 

 

类型限定词const

Const int nochange;

Nochange=12;

不能给nochange赋值12

Const int nochange=12;

合法

 

指针中的const

Const float *pf;

Pf本身的值可以改变,但指向的值不变

Float * const pt;

总是指向同一个地址,但所指向的值可以改变

Const float * const ptr

总是指向同一个地址,所指向的值不变

Const const * pfc;

等价于Const float *pfc;

                                                                                                               

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值