第18讲 局部变量 全局变量和存储分类 局部变量作用域和生存期
C语言计算机二级考试教程第12章

4
#include “stdio.h” int a=4; int f( int n ) { int t=0; static int 6; t += a++; } else { int a=7; t += a++; } return t+a++; } main() { int s=a,i=0; for( ; i<2; i++) s+= f ( i ); pintf ( “%d\n”, s ); }
局部变量、全局变量和存储分类 1. 用户标识符的作用域:用户标识符的使用范围。 2. 局部变量:局部变量也称为内部变量,在函数内定 义的变量(包括形参)。作用域仅限于函数内。
3.全局变量:也称外部变量,是在函数外部定义的变 量,它不属于任何一个函数,而属于一个源程序文 件。作用域是从定义位置开始到整个源程序结束 4. 存储分类:auto、register、static、extern
3
int func(int a,int b) { static int m,i=2; i+=m+1; m=i+a+b; return m; } main( ) { int k=4,m=1,p,i; for(i=1;i<=2;i++) { p=func(k,m); printf("%d,",p); } }
1
例如: int f1(int a) { int b,c; …… /* a,b,c有效*/ }
int f2(int x) { int y,z; …… /*x,y,z有效*/ } main() { int m,n; ……/*m,n有效*/ }
局部变量和全局变量

Print语句显示在消息框,select显示在网格框。
全局变量
print '所用SQL Server的版本信息'
print @@version
print ''
print '服务器名称为: ' @@servername
print '所用的语言为: ' @@language
go
Transact v 办理,交易,处理,谈判
二、全局变量
1、全局变量:全局变量是系统给定的局部变量;全局变量是SQL Server系统提供并赋值的变量。用户不能定义全局变量,也不能使用set语句来修改全局变量。
全局变量是一组特定的函数,它们的名称以@@开头,而且不需要任何参数,在调用时无需在函数名后面加上一对圆括号,这些函数也称为无参数函数。
日期函数:getdate()返回服务器的当前日期和时间、datename(日期元素,日期)返回指定日期的名字,返回字符串、datepart(日期元素,日期)返回指定日期的一部分,用整数返回、datediff(日期元素,日期1,日期2)返回两个日期间的差值并转换为指定日期元素的形式、dateadd(日期元素,数值,日期)将日期元素加上日期产生新的日期
print '今天的日期是: ' datename(yy,getdate()) '年' datename(mm,getdate()) '月' datename(dd,getdate()) '日'
select 日期=datename(yy,getdate()) '年' datename(mm,getdate()) '月' datename(dd,getdate()) '日'
C语言中用户标示符的作用域和存储类

/* file2.c文件*/ #include <stdio.h> extern int n; void func () { printf ( "file2:%d\n", n); … }
所有函数都是外部的,因为不允许在函数内部定义另一个函数。但当定义函 数时,可以使用extern或static说明符。ຫໍສະໝຸດ 局部变量、全局变量和存储分类
用户标识符的作用域
局部变量及其作用域和生存期 全局变量及其作用域和生存期 函数的存储分类
用extern说明函数 用static说明函数
局部变量、全局变量和存储分类
auto变量、register变量、静态存储类的局部变量
float a; 就等价于: auto float a; auto变量的存储单元被分配在内存的动态存储区。每当进入函数体(或 复合语句)时,系统自动为auto变量分配存储单元;退出时自动释放这些 存储单元另作他用。 auto变量的作用域是从定义的位置起,到函数体(或复合语句)结束为止。
结果
** main(1) **:10 ** fun **:20 ** main(2) **:10 即全局变量sum的作用域是除 函数fun以外的整个程序;局部 变量sum的作用域仅是函数fun 内部。
全局变量是在函数外部任意位置上定义的变量,它的作用域是从变量定义 的位置开始,到整个源文件结束止。
全局变量可使用extern和static两种说明符。
全局变量是在函数外部任意位置上定义的变量,它的作用域是从变量定义 的位置开始,到整个源文件结束止。
例如
void fun1 ( void); void fun2 ( void ); int sum; /*定义全局变量*/ main () { … sum++; … } void fun1 ( void ) { … sum++; … } int test; /*定义全局变量*/ void fun2 ( void ) { … sum++; test =1; … } sum是在整个源程序的开始定义的,它的作 用域是整个程序。 test是在函数fun2前定义的,它的作用域从定 义处开始直到程序结束。 全局变量的使用相当于为函数之间的数据 传递另外开辟了一条通道。 全局变量的生存期是整个程序的运行期间。 若全局变量和某个函数中的局部变量同名, 则在该函数中,此全局变量被屏蔽,在该函数 内,访问的是局部变量,与同名的全局变量不 发生任何关系。
变量的作用域和生存期

变量的作用域局部变量和全局变量在函数和复合语句内定义的变量,只在本函数或复合语句范围内有效(从定义点开始到函数或复合语句结束),他们称为内部变量或局部变量。
在函数之外定义的变量是外部变量,也称为全局变量(或全程变量)。
如果在一个函数中全局变量和局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,即他不起作用,此时局部变量是有效的。
全局变量的作用是增加函数间数据联系的渠道。
虽然全局变量有以上优点,但建议不必要时不要使用全局变量,因为全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元。
在程序设计时,对模块的划分要求:内聚性强,与其他模块的耦合性弱,这样便于程序的移植,可读性强。
变量的生存期变量的存储方式分为两种:静态存储方式和动态存储方式。
静态存储方式是指在程序与性能期间由系统在静态存储区分配存储空间的方式,在程序运行器件不释放;而动态存储方式则是在函数调用期间根据需要在动态存储区分配存储空间的方式。
这就是变量的存储区别。
Auto----声明自动变量函数中的形参和在函数中定义的变量都属于此类。
在调用这些函数时,系统给这些变量分配存储空间,函数调用结束时就自动释放这些存储空间。
因为这类局部变量称为自动变量(auto 变量)。
关键字auto作为存储类别的声明。
Auto可省略Static-----声明静态变量希望函数中的变量的局部变量的值在函数调用结束后不消失而继续保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量已有值,就是上一次函数调用结束时的值。
这时就用关键字static指定该局部变量为“静态存储变量”。
对静态局部变量的说明静态局部变量属于静态存储类别,在静态存储区内分配存储单元,在程序整个运行期间都不释放。
而自动变量(即动态局部变量)属于动态存储类别,占胴体啊存储区空间而不占静态存储区空间,函数调用结束后即释放。
对静态局部变量是在编译时赋初值的,即只赋初值一次,在以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。
变量类型,变量作用域,变量存储空间,变量生命周期

变量类型,变量作⽤域,变量存储空间,变量⽣命周期变量类型常量是不可变的值,可以⽤宏来定义,⽐如 #define PI 3.14变量的值是可以变化的,由于编程的不同需求,对变量有各种要求, ⽐如:变量的⽣命周期,变量的初始状态,变量的有效区域(作⽤域),变量的存储地和存储区域的⼤⼩。
为了满⾜这些不同的编程需求,C语⾔发明者设置了以下变量: 1 不同数据类型的变量。
⽐如 char,int,float等。
(变量在内存中占⽤地址⼤⼩由数据类型决定) 2 全局变量 3 局部变量 4 静态变量:包括静态全局变量和静态局部变量 5 寄存器变量 6 外部变量C语⾔中,除了基本类型外,开发者可以通过typedef来定义⾃⼰需要的数据类型。
⽐如: typedef int INT; typedef unsigned int UINT; typedef struct student { char *name; int age; }STUDENT; 如果结构体student不⽤typedef重定义的话,定义结构体变量时:struct student stu1; 使⽤typedef重定义以后,我们只需要STUDENT stu1;即可。
1 全局变量。
在函数外定义,可被所有函数使⽤。
但是在多线程访问时,需要注意多线程安全问题。
2 局部变量。
在函数内部声明。
只有在函数执⾏时,局部变量才存在,函数执⾏完局部变量就消失。
3 静态变量。
分配在内存中的数据段中,在C程序运⾏的整个过程中⼀直保留,静态变量可以定义成静态全局变量和静态局部变量。
①静态全局变量在程序的整个运⾏期间都存储且内存地址不会改变。
②静态局部变量只在声明它的函数内有效,且在下⼀次调⽤时还保留上次调⽤结束时的值(只初始化⼀次)。
4 寄存器变量。
寄存器变量存放在CPU的寄存器中,使⽤寄存器变量⽐内存变量操作速度快得多。
只有整型和字符型变量可以定义为寄存器变量。
c语言中变量的存储类别

一.C语言中,从变量的作用域角度来分,可以分为全局变量和局部变量。
二.变量值存在的时间角度来分,可以分为静态存储方式和动态存储方式。
所谓静态存储方式是指在程序运行期间有系统分配固定的存储空间的方式。
而动态存储方式则是在程序运行期间根据需要进行动态的分配存储空间的方式。
具体包含4种:自动的(auto),静态的(static),寄存器的(register),外部的(extern)。
1. 自动的(auto)在调用函数时系统会给他们分配存储空间,在函数调用结束时就自动释放这些存储空间,这类局部变量称为自动变量。
2. 静态的(static)为了满足局部变量的值在函数调用结束后不消失而且保留原值,既占用的存储单元不释放,就出现了静态的局部变量,用static来声明的局部变量。
局部变量的特点:(1)相对自动变量(即动态局部变量),在程序的运行期间都占用静态存储区,直到程序结束才释放该存储区。
(2)静态局部变量只是在程序编译时赋初值,以后每次调用时不再重新赋初值,而只是保留上次函数调用结束时的值。
动态局部变量编译时不赋初值,直到程序调用时才给变量赋值,每次调用都要赋初值。
(3)在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时会自动赋初值0或空字符。
而对动态局部变量,不赋初值则它的值是一个不确定的值,因为动态变量每次都要自动分配存储空间,存储空间的值是不固定的。
(4)静态局部变量在函数调用结束后不释放,但其他函数是不能调用的。
3.寄存器的(register)为了提高程序的执行效率,对一些运算频繁的变量定义为寄存器变量可以节省每次程序执行时的内存读取,大大节省了时间,提高了效率。
寄存器的一些特点:(1)寄存器变量的特点程序运行时分配寄存器存储空间,结束时释放。
这个特点限定了只能把局部自动变量和形式参数定义为寄存器变量。
(2)局部静态变量不能定义为寄存器变量。
4. 外部的(extern)外部变量是在函数的外部定义的全局变量,他的作用是从变量的定义初开始,到本程序文件的末尾。
全局变量、局部变量、静态全局变量、静态局部变量的区别

全局变量、局部变量、静态全局变量、静态局部变量的区别⼀、C++变量根据定义的位置的不同的⽣命周期,具有不同的作⽤域,作⽤域可分为6种:全局作⽤域,局部作⽤域,语句作⽤域,类作⽤域,命名空间作⽤域和⽂件作⽤域。
(1)从作⽤域看:1、全局变量具有全局作⽤域。
全局变量只需在⼀个源⽂件中定义,就可以作⽤于所有的源⽂件。
当然,其他不包含全局变量定义的源⽂件需要⽤extern 关键字再次声明这个全局变量。
2、静态局部变量具有局部作⽤域,它只被初始化⼀次,⾃从第⼀次被初始化直到程序运⾏结束都⼀直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,⽽静态局部变量只对定义⾃⼰的函数体始终可见。
3、局部变量也只有局部作⽤域,它是⾃动对象(auto),它在程序运⾏期间不是⼀直存在,⽽是只在函数执⾏期间存在,函数的⼀次调⽤执⾏结束后,变量被撤销,其所占⽤的内存也被收回。
4、静态全局变量也具有全局作⽤域,它与全局变量的区别在于如果程序包含多个⽂件的话,它作⽤于定义它的⽂件⾥,不能作⽤到其它⽂件⾥,即被static关键字修饰过的变量具有⽂件作⽤域。
这样即使两个不同的源⽂件都定义了相同名字的静态全局变量,它们也是不同的变量。
(2)从分配内存空间看:1、全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,⽽局部变量在栈⾥分配空间2、全局变量本⾝就是静态存储⽅式,静态全局变量当然也是静态存储⽅式。
这两者在存储⽅式上并⽆不同。
这两者的区别虽在于⾮静态全局变量的作⽤域是整个源程序,当⼀个源程序由多个源⽂件组成时,⾮静态的全局变量在各个源⽂件中都是有效的。
⽽静态全局变量则限制了其作⽤域,即只在定义该变量的源⽂件内有效,在同⼀源程序的其它源⽂件中不能使⽤它。
由于静态全局变量的作⽤域局限于⼀个源⽂件内,只能为该源⽂件内的函数公⽤,因此可以避免在其它源⽂件中引起错误。
1)静态变量会被放在程序的静态数据存储区(全局可见)中,这样可以在下⼀次调⽤的时候还可以保持原来的赋值。
局部变量、全局变量、静态变量的含义及存储位置

局部变量、全局变量、静态变量的含义及存储位置1.局部变量在⼀个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使⽤它们,在此函数以外时不能使⽤这些变量的,它们称为局部变量。
局部变量保存在动态数据区的栈中,只有在所在函数被调⽤时才动态地为变量分配存储单元。
1).主函数main中定义的变量也只在主函数中有效.2).不同函数中可以使⽤名字相同的变量,它们代表不同的对象,互不⼲扰.3).形参也是局部变量.4).在复合语句中定义的局部变量,这些变量只在本复合语句中有效.2.全局变量在函数外定义的变量是外部变量,外部变量是全局变量,全局变量可以为本⽂件中其它函数所共⽤,它的有效范围从定义变量的位置开始到本源⽂件结束。
全局变量位于静态数据区中。
1).设全局变量的作⽤:增加了函数间数据联系的渠道.2).建议不再必要的时候不要使⽤全局变量,因为a.全局变量在程序的全部执⾏过程中都占⽤存储单元.b.它使函数的通⽤性降低了3).如果外部变量在⽂件开头定义,则在整个⽂件范围内都可以使⽤该外部变量,如果不再⽂件开头定义,按上⾯规定作⽤范围只限于定义点到⽂件终了.如果在定义点之前的函数想引⽤该外部变量,则应该在该函数中⽤关键字extern作外部变量说明.4).如果在同⼀个源⽂件中,外部变量与局部变量同名,则在局部变量的作⽤范围内,外部变量不起作⽤.3.静态变量静态变量并不是说其就不能改变值,不能改变值的量叫常量。
其拥有的值是可变的,⽽且它会保持最新的值。
说其静态,是因为它不会随着函数的调⽤和退出⽽发⽣变化。
即static局部变量只被初始化⼀次,下⼀次依据上⼀次结果值;静态变量的作⽤范围要看静态变量的位置,如果在函数⾥,则作⽤范围就是这个函数。
静态变量属于静态存储⽅式,其存储空间为内存中的静态数据区(在静态存储区内分配存储单元),该区域中的数据在整个程序的运⾏期间⼀直占⽤这些存储空间(在程序整个运⾏期间都不释放),也可以认为是其内存地址不变,直到整个程序运⾏结束(相反,⽽auto⾃动变量,即动态局部变量,属于动态存储类别,占动态存储空间,函数调⽤结束后即释放)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
局部变量 全局变量和存储分类 局部变量及其作用域和生存期
第八章 用户标识符的作用域和存储类
8.1 局部变量,全局变量和存储分类
1. 用户标识符的作用域 作用域 在C语言中,由用户命名的标识符都有一个有 效的作用域.所谓"作用域"是指程序中的某一 部分,只有在这一部分中,该标识符才是有定义 的,即只有在这个域中才能使用该标识符. 例如,在某一函数内定义的变量,只能在该 函数内进行使用.显然,变量的作用域与其定义 语句在程序中出现的位置有直接的关系.由此可 以划分为局部变量和全局变量.
2. 局部变量 例 不同函数中同名变量 例 复合语句中变量
Ch7_103.c Ch7_102.c
局部变量 float f1(int a) 5 #define N { main() int b,c; 定义:在函数内定义,只在本函数内有效 main() a,b,c有效 a,b; { int{ …….i; 说明: } int a=3; int a[N]={1,2,3,4,5}; b=4; ①在main函数中定义的变量只能在main函数中有效 printf("main:a=%d,b=%d\n",a,b); char f2(int x,int y) for(i=0;i<N/2;i++) ②不同函数中的同名变量,占不同的内存单元 sub(); i,j; temp; { { int int x,y,i,j有效 printf("main:a=%d,b=%d\n",a,b); ③函数的形参属于局部变量 …… temp=a[i]; } } ④可以定义只在某个复合语句中有效的变量 a[i]=a[N-i-1]; sub() main() a[N-i-1]=temp; { int a,b;m,n; { int } m,n有效 a=6;……. b=7; for(i=0;i<N;i++) } printf("sub:a=%d,b=%d\n",a,b); printf("%d ",a[i]); } }
…….
动 态 存 储 区
auto变量的应用示例(4/8)
main() {void f(int x,int y); int a , b; a=10;b=20; f(a,b); if(a<b) {int t; t=a; a=b;b=t; } f(a,b); }
void f(int x,int y) {int t; t=x+y; printf("x=%d,y=%d,x+y=%d\n",x,y,t); } x=10,y=20,x+y=30
内存
main: a main: b main: t
2000 2001 2002 2003 2004 2005 2006 2007 2008 2009
20 10 10
…….
动 态 存 储 区
auto变量的应用示例(7/8)
main() {void f(int x,int y); int a , b; a=10;b=20; f(a,b); if(a<b) {int t; t=a; a=b;b=t; } f(a,b); }
main: a main: b f: x f: y f: t
主函数运行结束时,内存中 所有的变量均被释放
2000 2001 2002 2003 2004 2005 2006 2007 2008 2009
10 20 20 10 30
…….
动 态 存 储 区
2. register变量
寄存器变量也是自动类变量.这种变量的值是保留在CPU内 部的寄存器中. 特点:程序运行速度快.主要针对过去的计算机速度慢. 运算速度慢,访问内存速度慢 说明 1.一个计算机系统中的寄存器数目是有限的,因此只能定义少 量的寄存器变量.当程序中的寄存器变量较多时,或编译程 序认为指定的变量不适合放在寄存器中时,将自动按auto变 量来处理.因此,register说明只是对编译程序的一种建议. 2.由于register变量的值是放在寄存器内而不是放在内存中, 因此register变量没有地址,也就不能对它进行求地址运算. 3.为了提高寄存器的利用率,register变量应尽量做到即定义 即使用,用完就释放. 4.有些编译程序不理采寄存器变量的定义,直接将其当auto变 量来处理.
内存
main: a main: b f: x f: y f: t
2000 2001 2002 2003 2004 2005 2006 2007 2008 2009
10 20 10 20 30
…….
动 态 存 储 区
auto变量的应用示例(5/8)
main() {void f(int x,int y); int a , b; a=10;b=20; f(a,b); if(a<b) {int t; t=a; a=b;b=t; } f(a,b); }
10 20 main: t
…….
动 态 存 储 区
auto变量的应用示例(6/8)
main() {void f(int x,int; if(a<b) {int t; t=a; a=b;b=t; } f(a,b); }
void f(int x,int y) {int t; t=x+y; printf("x=%d,y=%d,x+y=%d\n",x,y,t); } x=10,y=20,x+y=30
10 20 f: x f: y f: t
…….
动 态 存 储 区
auto变量的应用示例(8/8)
main() {void f(int x,int y); int a , b; a=10;b=20; f(a,b); if(a<b) {int t; t=a; a=b;b=t; } f(a,b); }
void f(int x,int y) {int t; t=x+y; printf("x=%d,y=%d,x+y=%d\n",x,y,t); } x=10,y=20,x+y=30 x=20,y=10,x+y=30 内存
main() {void f(int x,int y); int a , b; a=10;b=20; f(a,b); if(a<b) {int t; t=a; a=b;b=t; } f(a,b); }
void f(int x,int y) {int t; t=x+y; printf("x=%d,y=%d,x+y=%d\n",x,y,t); }
void f(int x,int y) {int t; t=x+y; printf("x=%d,y=%d,x+y=%d\n",x,y,t); }
内存
2000 2001 2002 2003 2004 2005 2006 2007
main:a main: b
动 态 存 储 区
…….
auto变量的应用示例(2/8)
void f(int x,int y) {int t; t=x+y; printf("x=%d,y=%d,x+y=%d\n",x,y,t); } x=10,y=20,x+y=30
内存
main: a main: b
2000 2001 2002 2003 2004 2005 2006 2007 2008 2009
auto变量的应用示例(1/8)
main() main() {void f(int x,int y); {void f(int x,int y); int aa,,b; int b; a=10;b=20; a=10;b=20; f(a,b); f(a,b); if(a<b) if(a<b) {int t; {int t; t=a; a=b;b=t; t=a; a=b;b=t; } } f(a,b); f(a,b); } }
6. 变量的存储类型,作用域与生存期
局部变量 存储类别 存储方式 auto register 动态 static局部 全部变量 static外部 静态 静态存储区 外部
寄存器 存储区 动态区 生存期 函数调用开始至结束
程序整个运行期间
作用域 定义变量的函数或复合语句内 本文件 其它文件 赋初值 每次函数调用时 编译时赋初值,只赋一次 未赋初值 不确定 自动赋初值0或空字符 局部变量默认为auto型 register型变量个数受限,且不能为long, double, float型 static局部变量具有全局寿命和局部可见性 static局部变量具有可继承性 extern不是变量定义,可扩展外部变量作用域
void f(int x,int y) {int t; t=x+y; printf("x=%d,y=%d,x+y=%d\n",x,y,t); } x=10,y=20,x+y=30
内存
main: a main: b
2000 2001 2002 2003 2004 2005 2006 2007 2008 2009
3. 全局变量
定义:在函数外定义,可为本文件内的所有函数共用 有效范围:从定义变量的位置开始到本源文件结束,及有 extern说明的其它源文件
全局变量说明 全局变量说明: extern 说明
数据类型
变量表;
全局变量定义 次数: 只能1次 位置: 所有函数之外 分配内存: 分配内存,可初始化
全局变量说明 可说明多次 函数内或函数外 不分配内存,不可初始化
8.2 局部变量及其作用域和生存期
1. auto变量 在函数内部(或复合语句内)定义变量时,若使用auto(或缺 省) ,称为"动态局部变量" 内. 如在一函数中有定义:auto int a; 或 int auto a; 或 int a; 则整型变量a是一个自动类的局部变量. auto变量的特点: 1. 由于自动类局部变量的存储单元是在进入这些局部变量所 在的函数体(或复合语句)时分配,退出所在的函数体(或复 合语句)时释放,所以这些变量的生存期是"短期" . 2. 多次进入同一函数体(或复合语句)时,自动类局部变量所 分配的存储位置可能不同.所以,未赋初值的自动变量其 值为一个随机值. 3.不同函数中使用同名变量不会相互影响.