C语言杂谈(三)存储类别
本文讨论C语言中的存储类别,包括数据在内存的存储、变量的存储类别、函数的存储类别、生存周期。下图为计算机的存储空间,有寄存器和内存。
一、存储区域
1.寄存器:存放立即参加运算的数据。
2.系统区:存放系统软件。
3.用户程序代码区:存放用户程序的程序代码。
4.库程序代码区:存放库函数的代码。
5.数据区,分为堆区、栈区和静态存储区。
(1)堆区:存放动态变量,即由malloc申请的动态变量。
(2)栈区:存放自动存储类型的变量,包括函数和复合语句中的局部变量等。
(3)静态存储区:存放具有显式声明的静态类型的变量。

二、变量的存储类别
1.静态变量
静态变量:这里的静态指的一般程序设计语言概念中的静态变量,即程序中显式声明的变量。静态变量有一个名字,在编译时,编译程序已经给静态变量分配了内存空间。
静态变量的存储类型分为两大类:静态(包括static和extern)和自动(包括auto)
auto:自动存储类别,默认的存储类别
存储在栈区,作用域在声明它的函数和复合语句中。auto具有本地生存期,当声明自动变量的个体执行结束,自动变量结束生存周期,不再存在。
auto int i;
int j;//默认为auto存储类别
static:静态存储类别
存储在静态存储区。静态变量分为静态局部变量和静态全局变量。
静态局部变量:具有本地生存期,生存周期是整个程序,在程序结束后,生存期结束并被删除。但作用域仅在声明它的个体中。离开复合语句或函数,静态变量依然存在但不能被访问。再次进入声明该静态变量的个体时,可以继续使用,而且保留浅一些使用留下的值。静态局部变量只能在开始时初始化一次。
全局局部变量:生存周期是包含它声明的整个程序文件,可随时访问。
{
static int a;
...
}//作用域仅在复合语句内,同auto
//离开复合语句,静态局部变量存在但不能被使用,值保持上一次的使用
extern外部存储类别
尽可用作全局变量的存储类型。存储在静态存储区。在顶层声明中,extern是默认存储类别,所有未加extern的全局变量均被视为外部变量。在使用其他文件的外部变量时,使用extern说明符,这样在连接时分配相同的存储区,占用相同的存储空间。若两个文件中的同名全局变量都没有使用extern,会在连接时出现错误,因为他们都被声明成全局的外部变量,都分配了存储空间,产生冲突。
文件1:
int a;//extern是全局变量默认的存储类别
文件2
extern int a;//使用文件1的局部变量,占用相同存储空间
注:register寄存器存储类型可以显式声明,表明变量要分配在计算机CPU中的寄存器中,对于频繁访问的变量,可以节约时间,提高程序运行效率。但是,寄存器数量很有限,若寄存器边纳凉太多,将被认为是auto类型。
2.动态变量
动态变量:是指使用申请空间函数(如malloc)动态申请的空间,存放在堆区。动态变量没有显式声明,在编译的时候不分配(也无法分配)空间。在程序运行时,动态变量由指针标识。使用完毕后,使用释放空间函数(如free)等释放。动态函数具有动态生存期,生存周期是显式实现的。
float *p;
p=(float*)malloc(sizeof(float));//生存周期开始
...
free(p);//生存周期结束
三、函数的存储类别
C语言的函数可以被定义成static和extern两种存储类别。
static:内部函数
与变量的static存储类别相区别。内部函数的作用域调用范围仅限于本文件,在不同源文件中的同名静态函数不会混淆。
extern:外部函数
函数默认的存储类别。外部函数在一个源文件中被定义,在其他源文件可以使用。在一个源程序文件中调用其它源程序文件中定义的外部函数时,必须在本源文件中用函数原型说明它,并加上extern前缀。
所有的函数都具有静态生存期,即分配的空间在程序执行前开始,保持到程序执行结束为止。
文件1:
int f(float x)//函数默认的存储类别是外部函数
{
...
}
文件2:
extern int f(foat);//使用外部函数
C语言杂谈(三)存储类别的更多相关文章
- C语言变量的存储类别
我们知道,从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量. 从另一个角度,从变量值存在的作时间(即生存期)角度来分,可以分为静态存储方式和动态存储方式. 静态存储方式:是指在程序运行期 ...
- c语言 变量的存储类别以及对应的内存分配?
<h4><strong>1.变量的存储类别</strong></h4>从变量值存在的角度来分,可以分为静态存储方式和动态存储方式.所谓静态存储方式指在程 ...
- C语言函数的存储类别
函数默认的隐含存储类型是extern auto:只能用于局部变量 extern:允许被其他文件调用 static:只能被本源程序文件调用
- C语言存储类别和链接
目录 C语言存储类别和链接 存储类别 存储期 五种存储类别 C语言存储类别和链接 最近详细的复习C语言,看到存储类别的时候总感觉一些概念模糊不清,现在认真的梳理一下.C语言的优势之一能够让程序员恰 ...
- [转]深入探讨C语言中局部变量与全局变量的作用域与存储类别
C语言中局部变量和全局变量变量的作用域与存储类别(auto,static,extern,register) 1.局部变量和全局变量在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元, ...
- C语言_了解一下C语言中的四种存储类别
C语言是一门通用计算机编程语言,应用广泛.C语言的设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言. C语言中的四种存储类别:auto ...
- C语言中存储类别又分为四类:自动(auto)、静态(static)、寄存器的(register)和外部的(extern)。
除法运算中注意: 如果相除的两个数都是整数的话,则结果也为整数,小数部分省略,如8/3 = 2:而两数中有一个为小数,结果则为小数,如:9.0/2 = 4.500000. 取余运算中注意: 该运算只适 ...
- C语言中存储类别、链接与内存管理
第12章 存储类别.链接和内存管理 通过内存管理系统指定变量的作用域和生命周期,实现对程序的控制.合理使用内存是程序设计的一个要点. 12.1 存储类别 C提供了多种不同的模型和存储类别,在内存中 ...
- C语言的存储类别和动态内存分配
存储类别分三大类: 静态存储类别 自动存储类别 动态分配内存 变量.对象--->内存管理 内存考虑效率(时间更短.空间更小) 作用域 链接.---->空间 存储器 ----->时 ...
随机推荐
- 学期总结ngu
不知不觉一年就过去了,真可谓光阴似箭,日月如梭,在这一年里,我成长了许多,懂得了如何跟队友合作,提高了我的交际能力,懂得了许多课本知识,增进了我的编写能力.最重要的是学会了总结经验,这无疑是我这一年里 ...
- ok6410 android driver(10)
From this essay, we go to a new discussion "Android Hardware Abstraction Layer". In this e ...
- 使用jQueryUI的dialog实现一个提示功能
信息提示给用户是程序开发中,最常用的一个功能. Insus.NET使用jQueryUI的dialog来实现一个,可以定义标题,对话框的大小等. 在ASP.NET MVC环境下来演示吧. 在Octobe ...
- 【C#进阶系列】06 类型和成员基础
这些东西是基础中的基础,基本上是本书都会讲这个.但是很多东西到处都有,所以只捡了以下的这些写下来. 关于类型的可见性和可访问性 也就是public,internal这种东西,但是还是有个东西要提一下, ...
- 重新想象 Windows 8.1 Store Apps (72) - 新增控件: AppBar, CommandBar
[源码下载] 重新想象 Windows 8.1 Store Apps (72) - 新增控件: AppBar, CommandBar 作者:webabcd 介绍重新想象 Windows 8.1 Sto ...
- 【Effective Java】3、避免创建不必要的对象
创建对象的时候,有些变量可以一直保持的时候,可以不必要每次实例化对象的时候都把这些变量初始化一遍,可以使用静态和静态块的方式把这些变量的数据固定下来 package cn.xf.cp.ch02.ite ...
- 【iOS】Quartz2D信纸条纹
一.前导程序 新建一个项目,在主控制器文件中实现以下几行代码,就能轻松的完成图片在视图中的平铺. - (void)viewDidLoad { [super viewDidLoad]; UIImage ...
- 移除NDK方法
以下内容由:于伟建 提供 删除.project中的以下字段基本都是有cdt关键字的位置 删除.cproject然后重启eclipse,clean,重新编译我这里还有错误,就手动删了gen 删除包含cd ...
- [WP8] 使用ApplicationMenu与使用者互动
[WP8] 使用ApplicationMenu与使用者互动 范例下载 范例程序代码:点此下载 功能说明 使用过Lumia系列手机的开发人员,对于内建的相机功能相信都很熟悉.在Lumia内建的相机功能中 ...
- c++中string的常用函数说明
string可以说是是字符数组的升级版,使用更加啊方便,不容易出错.本文对string的常用函数进行简单介绍,做到会用即可. string中的常用函数分为四类,即赋值,添加,比较和删除. 一.赋值 1 ...