C语言_ch07_3_存储方式和生存期

合集下载

c语言中整型数据的存储形式

c语言中整型数据的存储形式

c语言中整型数据的存储形式在C语言中,整型数据(Integer)在内存中的存储形式是固定长度的二进制数。

它们可以是带符号数或无符号数,以及不同的长度和大小。

先说一下带符号数。

带符号整型数据可以表示负值。

在C语言中,最常用的带符号整型数据类型是int(整型),它占用4个字节(32位),可以表示从-2147483648到2147483647的整数值。

在存储带符号整型数据时,使用的是“二进制补码”(Two's Complement)表示法。

这种表示法是如此普遍的原因是它符合自然的加减运算法则,同时可以在CPU中用简单的电路实现。

比如,如果要存储-5这个数,首先将它的绝对值转化成二进制:5的二进制是101,接着将所有位取反得到010,最后加1得到011,这就是-5以二进制补码形式的存储形式:11111111 1111 1011。

再说说无符号整型数据(Unsigned Integer)。

它只能表示正整数,但在同样大小的空间内可以存储更大的值。

在C语言中,最常用的无符号整型数据类型是unsigned(无符号整数),它占用4个字节(32位),可以表示从0到4294967295的正整数值。

在存储无符号整型数据时,直接使用二进制表示这个数即可。

比如,如果要存储123这个数,直接将它转化成二进制即可:0111 1011。

除了int和unsigned,还有short(短整型)和long(长整型)等整型数据类型。

它们分别占用2个字节和8个字节。

这些数据类型在不同的编译器中占用的字节数可能不同。

无论用哪种整型数据类型,在内存中存储一个整型数据需要使用一块固定长度的内存空间。

对于32位的int,就需要4个字节的内存空间。

每个字节(Byte)由8个比特(Bit)组成,因此int变量会占用32个比特的空间。

这32个比特的位序(Bit Order)在不同的编译器和计算机体系结构中可能不同。

在存储整型数据时,常常需要考虑大小端(Endianness)的问题。

CH07-3安培定律

CH07-3安培定律

6
(讨论2)已知: I1,I2,a,求: f 2
I1
df 2
解:根据安培定律
r
I 2dr
L
I2
df 2 I 2dr B12
df 2 I 2drB12 sin 900
方向如图
a
因各电流元受力方向相同,故有
a L I 0 1 dr f 2 L I 2 B12dr I 2 2r a 方向:与 df 2 一致
I dl df12 df 21 2
0 I1 0 I 2dl sin 90 2a
因各电流元所受之力方向一致,故有:
a
f 21
L 0
0 I1 I 2 0 I1 I 2 dl L 2a 2a
方向与 d f 21 一致
同理可求 f12 如图
(可见,两导线互相吸引)
求:导线所受的磁场力
解:根据安培定律 df Idl B df I (dxi dyj dzk ) ( B x i B y j Bz k ) 0 I (dxi dyj ) ( Bk ) 0 I ( dx Bj dy Bi) y d f R 0 B f IBdx j IBdy i R 0 Idl I 2 IBR j
mv qB
2
× B
× × × × ×
R
v 值不变,方向变——匀速圆周运动! × 轨道半径: R
× × ×
R
× × ×
轨道周期: T 2R / v 2m / qB 与速度无关 应用:回旋加速器
× fm
×
2、粒子速度与磁场方向不垂直 v v// v

C语言:存储类型和作用域

C语言:存储类型和作用域

C语言:存储类型和作用域(共2页)一个C程序由一或多个程序文件组成。

在每一个程序文件中,可声明或定义若干函数,在整个程序中有且只有一个main()函数。

在每一个程序文件的最外层,除了声明或定义函数外,还可声明变量。

此外,在函数内部也可声明变量,声明函数原型,但不能定义函数。

声明变量时,除了数据类型外,还可指定变量的存储类型: static, auto, register, extern。

外层变量声明:在程序文件最外层建立的变量称外部变量(因为它们是在函数的外部定义的)。

有三种声明格式:(a)不指定存储类型:如int a, b=5; char c; 定义外部变量a,b,c。

(b)static变量:如static int d=6, e; 定义静态变量d,e。

以上两种声明定义的外部变量被分配在可执行程序的数据段内(静态分配)。

可指定初值,若不指定初值,则被初始化为二进制全0。

它们的作用域是从声明它起直到所在程序文件的文件尾。

用(a)定义的外部变量的作用域可在其他程序文件中用extern声明扩展,而static变量只能在本文件中使用。

(c)extern声明:如extern int f, g; 声明f和g是在另一程序文件中定义的外部变量。

这里不可再指定初值,数据类型(如int)也可省。

extern声明使在另一程序文件中定义的外部变量的作用域扩展到本程序文件中。

例. 程序文件1(Prog1.C):程序文件2(Prog2.C):int a,b; extern a;extern func2(); static int b;main() int func2(){ a=555;b=666; { b=777;func2(); } printf(“a=%d b=%d”,a,b); }本程序执行时将输出:a=555 b=777内层变量声明:在函数内部的函数体分程序或更内层的分程序(复合语句)声明的变量,可指定以下四种存储类型:auto,static,register和extern。

我学C语言---储存类别

我学C语言---储存类别
}
printf("Local x in outer scope of main is %d\n", x);

useLocal();/*useLocal中有一个自动局部变量x*/
useStaticLocal();/*useStaticLocal有一个静态局部变量*/
{
static int x = 50;
printf("\nlocal static x in useLocal is %d on entering useStaticLocal\n", x);
++x;
printf("local static x in useLocal is %d on exiting useStaticLocal\n", x);
}
/*函数useGlobal在被调用时将修改全局变量x的值*/
void useGlobal(void)
{
printf("\nGlobal x is %d on entering useGlobal\n", x);
x *= 10;
printf("Global x is %d on exiting useLocal\n", x);
只有变量才能够具有自动存储持续时间属性
Register它可以建议编译器把定义的变量保留在计算机的高速硬件寄存器中,现在很多性能优越的编译器能够识别出经常使用的变量,并且决定是否把它们放在寄存器中
关键字extern和static用于声明静态存储持续时间的变量和函数。静态存储持续时间的标识符从程序开始执行的时候就存在,对于变量而言,当程序开始执行时,就会分配存储空间并进行初始化。对于函数而言,当程序开始执行时,函数名就开始存在。但是,即使变量和函数的名称从程序一开始执行时就存在,并不意味着这些标识符能够用于整个程序中。存储持续时间和作用域是独立的问题

C语言变量的存储类别

C语言变量的存储类别

C语言变量的存储类别内存中供用户使用的存储空间分为代码区与数据区两个部分。

变量存储在数据区,数据区又可分为静态存储区与动态存储区。

静态存储是指在程序运行期间给变量分配固定存储空间的方式。

如全局变量存放在静态存储区中,程序运行时分配空间,程序运行完释放。

动态存储是指在程序运行时根据实际需要动态分配存储空间的方式。

如形式参数存放在动态存储区中,在函数调用时分配空间,调用完成释放。

对于静态存储方式的变量可在编译时初始化,默认初值为O或空字符。

对动态存储方式的变量如不赋初值,则它的值是一个不确定的值。

在C语言中,具体的存储类别有自动(auto)、寄存器(register)、静态(static)及外部(extern)四种。

静态存储类别与外部存储类别变量存放在静态存储区,自动存储类别变量存放在动态存储区,寄存器存储类别直接送寄存器。

变量存储类别定义方法:存储类别类型变量表;例如:(1)a,b,c为整型自动存储类别变量:auto int a,b,c;(2)x,y,z为双精度型静态存储类别变量:static double x,y,z;1、变量有哪些存储类型?变量的存储类型由“存储类型指明符”来说明。

存储类型指明符可以是下列类键字之一:autoregisterexternstatic下面是详细的解释:auto 存储类指明符--用于说明具有局部作用域的变量,它表示变量具有局部(自动)生成期,但由于它是所有局部作用域变量说明的缺省存储类指明符,所以使用得很少。

要注意的是,所有在函数内部定义的变量都是局部变量,函数内部定义的变量其作用域只在函数内部。

它的生存期为该函数运行期间,一旦离开这个函数或这个函数终止,局部变量也随之消失。

register 存储类指明符--当声明了这个指明符后,编译程序将尽可能地为该变量分配CPU内部的寄存器作为变量的存储单元,以加快运行速度。

注意,寄存器与存储器是不同的。

寄存器一般在CPU内部,而存储器一般指外部的(比如内存条),CPU内部的寄存器其运算速度是很高的。

C语言数据存储详解

C语言数据存储详解

C语言数据存储详解目录•一、数据类型•二、整型在内存中的存储• 1.原码、反码、补码•大小端介绍•三、浮点型在内存中的存储• 1.举一个浮点数存储的例子:•• 2.浮点数存储规则:••总结M表示有效数字,大于等于1,小于2。

2^E表示指数位。

举例来说:十进制的5.0,写成二进制是 101.0 ,相当于1.01×2^2 。

那么,按照上面V的格式,可以得出s=0,M=1.01,E=2。

十进制的-5.0,写成二进制是-101.0 ,相当于-1.01×2^2 。

那么,s=1,M=1.01,E=2。

IEEE 754规定:对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M。

对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。

IEEE 754对有效数字M和指数E,还有一些特别规定。

前面说过,1≤M<2 ,也就是说,M可以写成 1.xxxxxx 的形式,其中xxxxxx表示小数部分。

IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分。

比如保存1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。

这样做的目的,是节省1位有效数字。

以32位浮点数为例,留给M只有23位,将第一位的1舍去以后,等于可以保存24位有效数字。

至于指数E,情况就比较复杂。

首先,E为一个无符号整数(unsigned int)这意味着,如果E为8位,它的取值范围为0255;如果E为11位,它的取值范围为02047。

但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。

比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。

C语言常见问题解答之二变量和数据存储

C语言常见问题解答之二变量和数据存储
第三种(也是最后一种)内存空间实际上并不存储变量,但是可以用来存储变量所指向的数据。如果把调用malloc()函数的结果赋给一个指针变量,那么这个指针变量将包含一块动态分配的内存的地址,这块内存位于一段名为“堆(heap)”的内存空间中。堆开始时也很小,但当程序员调用malloc()或calloc()等内存分配函数时它就会增大。堆可以和数据段或栈共用一个内存段(memorysegment),也可以有它自己的内存段,这完全取决于编译选项和操作系统。
操作系统会试图去判断哪些页可能暂时不会被使用(通常基于过去使用内存的情况),如果它判断错了,或者程序正在很多地方存取很多内存,那么为了读入已调出的页,就会产生大量页错动作。因为RAM已被全部使用,所以为了调入要存取的一页,必须调出另一页,而这将导致更多的页错动作,因为此时不同的一页已被移到磁盘上。在短时间内出现大量页错动作的情形被称为页抖动,它将大大降低系统的执行效率。
2.static(静态的) 在函数外部说明为static的变量的作用域为从定义点到该文件尾部;在函数内部说明为static的变量的作用域为从定义点到该局部程序块尾部。
3.auto(自动的) 这是在函数内部说明的变量的缺省存储方式。auto变量的作用域为从定义点到该局部程序块尾部。
变量的生存期也有三种,但它们不象作用域那样有预定义的关键字名称。第一种是extern和static变量的生存期,它从main()函数被调用之前开始,到程序退出时为止。第二种是函数参数和auto变量的生存期,它从函数调用时开始,到函数返回时为止。第三种是动态分配的数据的生存期,它从程序调用malloc()或calloc()为数据分配存储空间时开始,到程序调用free()或程序退出时为止。
与栈相似,堆也有一个增长界限,并且决定这个界限的规则与栈相同。

C语言--while 和存储类型

C语言--while 和存储类型

while语句题号题目选项11 while语句的语义是计算表达式的值,当值为真(非0)2 while语句中表达式错误的是while(a>3)3 比较while语句和do…while语句正确的是while和do…while都是先判4 关于嵌套的说法不正确的是while语句可以嵌套5 下列嵌套使用错误的是while可以嵌入do…while6 输出结果:int i=2;while(i<5) i++;printf("%d",i);7 while(表达式) 语句表达式后不加分号,每个语句后8 while语句说法错误的是: 只能使用continue不能使用9 输出结果:int i=0,sum=0;while(i<5){sum+=i;i++;} sum=1510 输出结果:int sum=0;i=5;while(i<5){sum=sum+i;i++} sum=011 下列说法错误的是: 同样当有许多语句参加循环时, 要来12 输出结果:int i=0,sum=0;while(i<=5){sum+=i;i++;} sum=1513 下列说法错误的是: while语句可以嵌套14 比较while语句和do…while语句正确的是while和do…while都是先判15 while语句中表达式错误的是while(a>3&&a<9)16 输出结果:int i=0;while(i<=6) i++;printf("%d",i);17 下列说法错误的是: 循环体有几条语句时, 要用"{"和"18 输出结果:int i=0,k=1;while(i<2){k++;i++;} k=319 比较while语句和do…while语句正确的是do…while是先执行一次再判20 输出结果:inti=0,k=1;while(i<2){k++;}printf("%d",k); k=3存储类型题号题目选项11 不属于变量的存储类型的是auto2 关于局部变量说法不正确的是局部变量只在本函数内有效3 关于全局变量说法不正确的是: 全局变量也叫内部变量4 下列不正确的是: auto是动态存储方式5 变量存储类型正确的是: auto,static,int,extern6 下列正确的是: auto是动态存储方式7 下列说法不正确的是: 局部变量只在本函数内有效8 下列说法正确的是: 形参属于局部变量9 输出结果:int fac(){static i=0;i++;returni;}main(){printf("%d",fac());printf("%d",fac()); }10 下列正确的是: 局部变量默认的是auto型11 不属于变量存储类型的是: extern12 下列声明正确的是: int auto a;13 变量存储类型正确的是: double,register,extern,sta14 存储空间可以分为三部分,不属于这三部分的是: 程序区15 下列说法不正确的是: static只能用来声明局部变量16 下列正确的是: 全局变量默认的是auto型17 关于存储区说法错误的是: auto在动态存储区18 关于static说法错误的是static赋初值赋一次19 下列声明错误的是: int auto b;20 输出结果:int fac(){auto i=0;i++;returni;}main(){printf("%d",fac());printf("%d",fac()); }。

专升本C语言课件C08存储属性及预处理

专升本C语言课件C08存储属性及预处理

01
02
解决方案
仅在必要时使用宏定义,并尽量保持其简单 明了。避免在宏定义中使用复杂的表达式和 副作用。
问题2
未正确使用条件编译,导致不必要的 代码被编译和执行。
03
问题3
未包含必要的头文件,导致编译错误或链接 错误。
05
06
04
解决方案
根据编译环境和目标平台,合理使用 条件编译指令(如`#ifdef`、 `#ifndef`等),确保只编译必要的代 码。
问题2
在函数内部错误地使用了全局变量的存储属性。
解决方案
全局变量应声明在函数外部,并使用`extern`关键字在函 数内部引用。
问题3
未考虑到存储属性对内存分配和性能的影响。
解决方案
了解不同存储属性对内存分配和访问速度的影响,根据实 际需求选择。
预处理指令使用不当导致的问题
问题1
滥用宏定义,导致代码可读性降低和潜在错误。
03
预处理概述
预处理的定义
预处理是指在C语言编译过程中,对 源代码进行的一系列处理操作。
预处理指令是以“#”开头的特殊指 令,用于在编译前对程序进行特定的 处理。
预处理的作用
01
提高代码的可读性 和可维护性
通过预处理指令,可以将一些常 用的代码片段或宏定义集中管理, 使代码更加清晰易懂。
02
实现条件编译
静态存储类型
静态局部变量在函数调用之间保持其值,静态全局变量在 程序执行期间一直存在。静态变量在程序开始执行前创建 ,并在程序结束时销毁。
寄存器存储类型
寄存器变量存储在计算机的寄存器中,而不是内存中。这 使得对寄存器变量的访问速度更快,但寄存器变量的数量 有限。

char 和 string 在数据库的存储策略

char 和 string 在数据库的存储策略

char 和 string 在数据库的存储策略在数据库中,char和string是常用的存储数据类型。

它们可以用来存储文本、字符和字符串等信息。

char类型用于存储固定长度的字符数据,而string类型则用于存储可变长度的字符数据。

下面将详细介绍char和string在数据库中的存储策略。

一、char类型的存储策略:char是一种固定长度的数据类型,可以存储固定长度的字符数据。

在数据库中,char类型通常用于存储较短的文本信息,如姓名、性别、电话号码等。

1.存储方式:char类型的数据在数据库中以固定长度的方式存储。

即使输入的文本长度小于指定的长度,也会占用指定长度的存储空间。

例如,如果char(10)用于存储姓名,即使实际输入的姓名只有5个字符,也会占用10个字符的存储空间,剩余的5个字符位置用空格填充。

2.优点:-存取速度较快:由于char类型的数据存储是按照固定长度存储的,所以存取速度相对较快。

-占用存储空间少:char类型的数据存储是以固定长度存储的,因此占用的存储空间相对较小。

3.缺点:-浪费存储空间:当存储的文本长度小于指定的长度时,会浪费存储空间,因为剩余的位置会用空格填充。

-不适用于变长数据:由于char类型的数据存储是固定长度的,因此不适用于存储变长的文本数据。

当存储的文本长度超过指定的长度时,会导致截断。

二、string类型的存储策略:string(或varchar)是一种可变长度的数据类型,可以存储可变长度的字符数据。

在数据库中,string类型通常用于存储较长的文本信息,如地址、简历、文章等。

1.存储方式:string类型的数据在数据库中以可变长度的方式存储。

输入的文本数据占用的存储空间取决于数据的实际长度,不会浪费存储空间。

2.优点:-节省存储空间:与char类型不同,string类型的数据存储是以实际长度存储的,因此节省了存储空间,尤其是对于存储较长的文本数据。

-适用于变长数据:由于string类型的数据存储是可变长度的,因此适用于存储变长的文本数据,无需担心数据截断的问题。

函数的存储类型 -回复

函数的存储类型 -回复

函数的存储类型-回复函数的存储类型是指函数的代码被保存在哪个内存区域。

在大多数编程语言中,函数的存储类型主要分为静态存储类型和动态存储类型。

本文将详细介绍这两种存储类型,并探讨它们的特点、优缺点以及使用场景。

首先,我们来看静态存储类型。

静态存储类型意味着函数的代码在编译时就被分配了内存空间,并在整个程序的生命周期内都保持不变。

在C语言中,静态存储类型的函数使用关键字"static"进行声明。

静态存储类型的函数具有以下特点:1. 全局可见性:静态函数可以在文件内的任何位置调用,不受位置限制,即使在函数定义之前也可以使用。

2. 生命周期持久:静态函数的代码在程序一开始运行时就被加载到内存中,并一直存在于整个程序的生命周期内。

3. 具有私有性质:静态函数只能在声明它的文件内部使用,无法在其他文件中被调用。

4. 避免命名冲突:静态函数的作用域仅限于所在的文件,可以避免与其他文件中的函数产生命名冲突。

静态存储类型的函数适用于以下场景:1. 对于不需要与其他文件进行交互的函数,静态函数可以提供更好的封装性和安全性。

2. 在大型程序中,使用静态函数可以避免命名冲突,提高代码的可读性和可维护性。

3. 静态函数的生命周期持久,适用于在整个程序执行过程中需要频繁调用的函数。

静态存储类型的函数也存在一些缺点:1. 静态函数不能由其他文件调用,这限制了其在多文件项目中的使用范围。

2. 静态函数的代码始终存在于内存中,无法被回收,会占用一定的内存空间。

3. 当程序中静态函数过多时,会增加程序的内存占用量,可能导致内存不足的问题。

接下来,我们来看动态存储类型。

动态存储类型意味着函数的代码在运行时被动态地加载到内存中,并根据需要进行释放。

在大多数编程语言中,常见的动态存储类型函数是通过函数指针实现的。

动态存储类型的函数具有以下特点:1. 灵活性:动态存储类型的函数可以在程序运行时根据需要进行加载和释放,可以动态地修改函数的行为。

C语言_ch07_3_存储方式和生存期共30页

C语言_ch07_3_存储方式和生存期共30页

return 0;
}
2021/3/23
13
float average(float array[], int n) {
int i; float aver = 0.0f, sum = array[0]; max = min = array[0]; for (i=1; i<n; i++) {
if (array[i] > Max) max = array[i];
输出:3
11
例7.14 有一个一维数组,内放10个学生成绩,写一 个函数,当主函数调用此函数后,能求出平均分、 最高分和最低分。
解题思路:调用一个函数可以得到一个函数返回值 ,现在希望通过函数调用能得到3个结果。可以利 用全局变量来达到此目的。
2021/3/23
12
#include <stdio.h> float max=0, min=0; float average(float array[], int n);
return 0; }
2021/31/3/23
20
7.9 变量的存储方式和生存期
7.9.1 动态存储方式与静态存储方式 7.9.2 局部变量的存储类别 7.9.3 全局变量的存储类别 7.9.4 存储类别小结
2021/3/23
21
7.9.1动态存储方式与静态存储方式
从变量的作用域(即空间)的角度,变量分为 全局变量(外部变量) 局部变量
2021/3/23
28
这一节我们学习了
数组作为函数参数 作用域 局部变量和全局变量 内存存储区分类
2021/3/23
29
谢谢你的阅读
❖ 知识就是财富 ❖ 丰富你的人生

C语言的变量的作用域和生存期

C语言的变量的作用域和生存期

C语言的变量的作用域和生存期一、c程序存储空间布局C程序一直由下列部分组成:1)正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令;2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。

3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。

4)栈——增长方向:自顶向下增长;自动变量以及每次函数调用时所需要保存的信息(返回地址;环境信息)。

5)堆——动态存储分。

|-----------|| ||-----------|| 栈 ||-----------|| | || /|/ || || || /|/ || | ||-----------|| 堆 ||-----------|| 未初始化 ||-----------|| 初始化 ||-----------|| 正文段 ||-----------|二、面向过程程序设计中的static1. 全局静态变量在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。

1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在) 2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)3)作用域:全局静态变量在声明他的文件之外是不可见的。

准确地讲从定义之处开始到文件结尾。

看下面关于作用域的程序://teststatic1.cvoid display();extern int n;int main(){n = 20;printf("%d/n",n);display();return 0;}//teststatic2.cstatic int n; //定义全局静态变量,自动初始化为0,仅在本文件中可见void display(){n++;printf("%d/n",n);}文件分别编译通过,但link的时候teststatic1.c中的变量n找不到定义,产生错误。

c语言之生命周期与存储类

c语言之生命周期与存储类

c语言之生命周期/存储类1、概念解析1.1、存储类存储类:就是存储类型。

变量空间开辟于内存之中,存储类就是用于描述变量空间开辟于内存中什么地方。

事实上内存被分为了,栈、堆、数据段、bss段、.text段等不同管理方法的内存段,变量空间就开辟于这些内存段中。

譬如局部变量被分配在栈中,那么它的存储类就是栈。

又比如被显示初始化为非0的全局变量分配在data段,那么该全局变量的存储类就是data段。

又比如显式初始化为0和没有显示初始化(默认为0)的全局变量以及静态变量分配在bss段,该变量的存储类就是bss。

同理当变量空间在其它段时,那么它的存储类就是该存储段。

1.2、作用域(1)作用域是描述这个变量起作用的代码范围。

(2)基本来说,C语言变量的作用域规则是代码块作用域。

意思就是这个变量起作用的范围是当前的代码块。

代码块就是一对大括号{}括起来的范围,所以一个变量的作用域为这个变量定义所在的{}范围内从这个变量定义开始往后的部分。

以下两个例子可以帮助更好的理解作用域:1.3、生命周期生命周期是描述这个变量什么时候诞生,什么时候死亡,也即是运行时分配内存空间给这个变量,使用后收回这个内存空间,此后内存地址已经和这个变量无关了。

变量和内存的关系,就和人(变量)去图书馆借书(内存)一样。

变量的生命周期就好象我人借书的这段周期一样。

研究变量的生命周期可以帮助我们理解程序在运行时的一些特殊现象。

1.4、链接属性程序从源代码到最终可执行程序,经历的过程为预编译、编译、汇编和链接。

其中编译的目的就是把源代码翻译成xx.o 的目标文件,目标文件里面有很多符号和代码段、数据段、bss 段等分段。

符号就是编程中的变量名、函数名等。

运行时变量名、函数名能够和相应的内存对应起来,靠符号来做链接的。

xxx.o 的目标文件链接生成最终可执行程序的时候,其实就是把符号和相对应的段给链接起来。

C 语言中的符号有三种链接属性:外连接属性、内链接属性、无连接属性。

C语言数据类型、常量、变量、存储类型

C语言数据类型、常量、变量、存储类型
C语言数据类型、常量、变量、存 储类型
数据类型、常量、变量及存储类型
数据在单片机中的存放情况由数据类 型决定。 数据类型可分为复杂数据类型和基本 数据类型。
1、char 字符类型 2、int 整型 3、long 长整形 4、float 浮点型 5、指针型 6、bit 位标量 7、sfr 特殊功能寄存器 8、sfr16位特殊功能寄存器 9、sbit可寻址位
在LED16*2字符液晶试验板上实现两个局部 变量vall 、val2的显示:vall的值在右边2个 数码管上显示,从1到99变化。val2的值在 左边2个数码管上显示,从1到99显示奇数。
数据类型、常量、变量及存储类型
数据类型、常量、变量及存储类型
在LED/16*2字符液晶试验板上实现: 使4个LED数码管从左至右显示/熄灭 “0000”。显示/熄灭的时间约10ms。
数据类型、常量、变量及存储类型
在LED/16*2字符液晶试验板上实现: 使4个LED数码管从左至右显示/熄灭 “0000”。显示/熄灭的时间约10ms。
数据类型、常量、变量及存储类型
在LED16*2字符液晶试验板上实 现乘法运算:两个乘数分别为 常量与变量。其积在数码管上 显示(最大显示到50)。
数据类型、常量、变量及存储类型
在LED16*2字符液晶试验板上实 现乘法运算:两个乘数分别为 常量与变量。其积在数码管上 显示(最大显示到50)。
数据类型、常量、变量及存储类型
数据类型、常量、变量及存储类型
在LED16*2宇符液晶试验板上实现:使 无符号字符型变量×的值与无符号整 型变量y的值相乘.其积存于无符号整 型变量Z中。然后将Z的内容送LED16*2 字符液晶试验板。使4个LED数码管显 示z的内容。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2013-3-13
28

2013-3-13
26
int a = 0; //全局初始化区 char *p1; //全局未初始化区 int main() { int b; //栈 char s[] = "abc"; //栈
char *p2; //栈
char *p3 = "123456"; //123456\0在常量区,p3在栈上。 static int c =0; //全局(静态)初始化区 p1 = (char *)malloc(10);
2013-3-13 13
例7.15 若外部变量与局部变量同名,分析结果。
2013-3-13
14
#include <stdio.h> int a = 3, b = 5; int max(int a, int b); b为全局变量 int main() { int a = 8; printf("max=%d\n", max(a, b)); return 0; } a为局部变量,仅 int max(int a, int b) 在此函数内有效 { return a>b ? a : b; }
p2 = (char *)malloc(20);
//分配得来得10和20字节的区域就在堆区。 strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向 的"123456"优化成一个地方。
}
2013-3-13 27
这一节我们学习了

数组作为函数参数 作用域 局部变量和全局变量 内存存储区分类
2013-3-13 15
#include <stdio.h> int a = 3, b = 5; int max(int a, int b); int main() { int a = 8; printf("max=%d\n", max(a, b)); return 0; } int max(int a, int b) { a、b为局部变量,仅 return a>b ? a : b; 在此函数内有效 }
printf("x in outer block: %d\n", x); { /* new x, hides first x */ int x = 77; printf("x in inner block: %d\n", x); } printf("x in outer block: %d\n", x); while (x++ < 33) /* original x */ { int x = 100; /* new x, hides first x */ x++; printf("x in while loop: %d\n", x); } printf("x in outer block: %d\n", x); return 0; }
return 0;
}
2013-3-13 12
float average(float array[], int n) { int i; float aver = 0.0f, sum = array[0]; max = min = array[0]; for (i=1; i<n; i++) { if (array[i] > Max) max = array[i]; else if (array[i] < Min) min = array[i]; sum = sum + array[i]; } aver = sum / n; return aver; }

全局变量自动初始化为0 全局变量使函数之间的数据交换更容易,效率也高 一些 但是不推荐使用,甚至禁止使用


程序的任何部分都可以改写全局变量,很难确定在程 序的哪里改写了它;而且在作用域结束时才释放内存
2013-3-13
7
int p=1,q=5 float f1(int a) { int b,c; …… }
2
块作用域

块作用域是指包含在花括号之内的一段代码。 什么变量具有块作用域?

在一个代码块中声明的变量 起:从该变量被定义的地方
止:包含该定义的代码块末尾}

迄今为止,我们使用的局部变量,包括形式参数,都 具有代码块作用域。
2013-3-13
3
2013-3-13
4
函数原型作用域

函数原型作用域,适用于函数原型中使用的变量名, 从变量定义一直到原型声明的末尾。 意味着编译器所关心的只是参数的类型,所以函数原 型声明中参数名可以省略。 int max2(int, int);

全局变量(外部变量)

局部变量
静态存储方式 动态存储方式

从变量值存在的时间(即生存期),变量分为

如果一个变量值在某一时刻是存在的,则认为这一 时刻属于该变量的生存期
2013-3-13 21
操作 系统 内核
函数
用 户 区
22
2013-3-13
23
2013-3-13
24
全局数据区

全局数据区划分为三个区域。
1. 初始化的全局变量和静态变量 2. 未初始化的全局变量和未初始化的静态变量 3. 常量字符串

这些数据在程序结束后由系统释放。
2013-3-13
25
栈区和堆区

栈区(stack)

由编译器自动分配释放 ,存放函数的参数值,局 部变量的值等。 由程序员分配释放 。 malloc、free

堆区(heap)

7.11 内部函数和外部函数
1
2013-3-13
作用域(scope)

变量作用域

变量的有效区域。 或可访问区域。

C的变量作用域分为代码块作用域(block scope)、 函数原型作用域(function prototype scope)、文件 作用域(file scope)三种。
2013-3-13
char c1,c2;
p、q、c1、c2 为全局变量
char f2 (int x, int y)
{ int i,j; …… }
int main ( )
{ int m,n; ……
return 0;
2013-3-13
}
8
int p=1,q=5
float f1(int a) { int b,c; …… char c1,c2; char f2 (int x, int y) { int i,j; …… } int main ( ) { int m,n; …… return 0; }
2013-3-13 18
输出的存储方式和生存期
7.9.1 动态存储方式与静态存储方式
7.9.2 局部变量的存储类别
7.9.3 全局变量的存储类别 7.9.4 存储类别小结
2013-3-13
20
7.9.1动态存储方式与静态存储方式

从变量的作用域(即空间)的角度,变量分为
2013-3-13 9
}
p、q的有效范围
c1、c2的有效范围
#include <stdio.h> int numCalls = 0; void foo()
{
++numCalls; } int main() { foo(); foo(); foo(); printf("%d\n", numCalls); 输出:3
int main()
{ float ave,score[10]; int i;
printf("Please enter 10 scores:\n");
for(i=0; i<10; i++) scanf("%f", &score[i]); ave = average(score, 10); printf("max=%6.2f\nmin=%6.2f\naverage=%6.2f\n", max, min, ave);
第7章 用函数实现模块化程序设计

7.1为什么要用函数 7.2怎样定义函数


7.3调用函数
7.4对被调用函数的声明和函数原型 7.5函数的嵌套调用 7.6函数的递归调用 7.7数组作为函数参数
7.8局部变量和全局变量
7.9变量的存储方式和生存期 7.10 关于变量的声明和定义
2013-3-13 16
内层覆盖外层

Q:如果在内层代码块定义了一个具有和外层代码块 同名的变量,将发生什么? 内层覆盖外层

2013-3-13
17
/* hiding.c -- variables in blocks */ #include <stdio.h> int main() { int x = 30; /* original x */


2013-3-13
5
文件作用域

文件作用域,一个在所有函数之外定义的变量具有文 件作用域,从它定义处到包含该定义的文件结尾处可 见。 文件作用域变量也被称为全局变量(global variable)。

2013-3-13
6
全局变量(Global Variable)

在所有函数之外定义的变量是全局变量,在定义它的 位置以后都有效
}
10
例7.14 有一个一维数组,内放10个学生成绩,写一 个函数,当主函数调用此函数后,能求出平均分、 最高分和最低分。
相关文档
最新文档