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);//使用外部函数
时间: 2024-10-05 09:47:37

C语言杂谈(三)存储类别的相关文章

C语言变量的存储类别

我们知道,从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量. 从另一个角度,从变量值存在的作时间(即生存期)角度来分,可以分为静态存储方式和动态存储方式. 静态存储方式:是指在程序运行期间分配固定的存储空间的方式. 动态存储方式:是在程序运行期间根据需要进行动态的分配存储空间的方式. 用户存储空间可以分为三个部分: 程序区: 静态存储区: 动态存储区. 全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序行完毕就释放.在程序执行过程中它们占据固定的存储单元,而不

c语言 变量的存储类别以及对应的内存分配?

<h4><strong>1.变量的存储类别</strong></h4>从变量值存在的角度来分,可以分为静态存储方式和动态存储方式.所谓静态存储方式指在程序运行期间由系统分配固定的存储空间的方式(<strong>程序开始执行时分配,在程序完毕时释放,在程序过程中它们占据国定的存储单元,而不是动态分配和释放</strong>).而动态存储方式在运行期间根据需要进行动态存储方式(<strong>在程序过程中申请和释放的一些空间&

C语言存储类别和链接

目录 C语言存储类别和链接 存储类别 存储期 五种存储类别 C语言存储类别和链接 ? 最近详细的复习C语言,看到存储类别的时候总感觉一些概念模糊不清,现在认真的梳理一下.C语言的优势之一能够让程序员恰到好处的控制程序,可以通过C语言的内存管理系统指定变量的作用域和生存周期,实现对程序的控制. 存储类别 基本概念 对象:在C语言中所有的数据都会被存储到内存中,被存储的值会占用一定的物理内存,这样的一块内存被称为对象,它可以储存一个或者多个值,在储存适当的值时一定具有相应的大小.(C语言对象不同于面

C语言中存储类别又分为四类:自动(auto)、静态(static)、寄存器的(register)和外部的(extern)。

除法运算中注意: 如果相除的两个数都是整数的话,则结果也为整数,小数部分省略,如8/3 = 2:而两数中有一个为小数,结果则为小数,如:9.0/2 = 4.500000. 取余运算中注意: 该运算只适合用两个整数进行取余运算,如:10%3 = 1:而10.0%3则是错误的:运算后的符号取决于被模数的符号,如(-10)%3 = -1;而10%(-3) = 1. -- 1.  用关键字auto定义的变量为自动变量,auto可以省略,auto不写则隐含定为"自动存储类别",属于动态存储方式

变量存储类别

变量定义的一般形式: 存储类别 数据类型 变量名 存储类别指的是数据在内存中存储的方法.存储方法分为静态存储和动态存储两大类.标准C语言为变量.常量和函数定义了4种存储类型:extern.auto.static.register.根据变量的存储类别,可以知道变量的作用域和存储期.这4种存储类型可分为两种生存期限:永久的(在整个程序执行期都存在)和临时的(暂时保存在堆栈和寄存器中).extern和static用来标识永久生存期限的“变量和函数”,而anto和register用来标识临时生存期限的"

C++变量的存储类别与作用域

总结一下C++中变量的存储类别以及变量的作用域. (1)标示符的存储类别决定了标示符在内存中存在的时间(我们可以理解标示符就是确定一个变量的符号,也就是我们所说的变量名) 二:存储类别 (1)静态存储类别:静态存数类别变量(我们简称静态变量),从程序的开始处就存在,其生命期伴随整个程序. (2)自动存储类别:当变量时自动存储类别时,变量在进入到定义它们的程序快时定义它,在离开它们所在的程序块(作用域)时销毁它,因此成为自动变量.其中关键字auto和register用来声明自动类型的变量, 三:自

嵌入式Linux C语言(三)——指针与函数

嵌入式Linux C语言(三)--指针与函数 指针对函数的功能有巨大的贡献,指针能够将数据传递给函数,并且允许函数对数据进行修改.指针对于函数的作用主要有两方面:将指针传递给函数和声明函数指针. 一.程序的栈和堆 程序的栈和堆是C语言程序运行的运行时元素. 1.程序栈 程序栈是支持函数执行的内存区域,通常和堆共享一块内存区域,通常程序栈占据内存区域的下部,堆用内存区域的上部.程序栈存放栈帧,栈帧存放函数参数和局部变量.调用函数时,函数的栈帧被推倒栈上,栈向上长出一个栈帧,当函数终止时,函数的栈帧

变量的存储类别

全局变量和局部变量 在函数之外定义的变量称为外部变量,也是全局变量:在函数内部定义的变量称为局部变量,它只在本函数范围内有效.全局变量在程序的全部执行过程都占用存储单元,而局部变量只是在调用到该函数的时候才回去动态的给局部变量分配内存空间. 从 变量的作用域角度来分,可以分为全局变量(生命周期是该文件开始到结束)和局部变量(离开该方法或者复合语句就无效):从变量值存在的时间即生命周期来分可以分为 静态存储方式和动态存储方式. 所谓静态存储方式是指在程序运行期间有系统分配指定的存储空间的方式,而动

Swift语言指南(三)--语言基础之整数和浮点数

整数 整数指没有小数的整数,如42,-23.整数可以是有符号的(正数,零,负数),也可以是无符号的(正数,零). Swift提供了8,16,32,64位形式的有符号和无符号的整数,这些整数遵循与C语言相似的命名规则.如8位无符号整数的类型为UInt8,32位有符号整数的类型为Int32,和Swift语言的其它类型一样,这些整型命名以大写字母开头. 整数的边界 你可以通过min或max属性为每一个整数类型指定一个最小值或最大值: 1 let 最小值 = UInt8.min // 最小值 等于 0,