全局变量与局部变量的区别
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
s=a+b; ……b 作用域 } …… s,a 作用域 } [例 5.11]main() { int i=2,j=3,k; k=i+j; { int k=8; if(i==3) printf("%d\n",k); } printf("%d\n%d\n",i,k); } main() { int i=2,j=3,k; k=i+j; { int k=8; if(i=3) printf("%d\n",k);
Байду номын сангаас
自动变量和寄 存器变量 属于 动态存储 方式 , 外部变量和静态变 量属于静态存储方式。在介绍了变量的存储类型之 后, 可以知道对 一个变量的说明不仅应说明 其数 据类型, 还应说明 其存储类型。 因 此变量说明的 完整 形式应为: 存储类型说明符 数据类型说明 符 变
量名,变量名…; 例如: static int a,b; auto char c1,c2; static int a[5]={1,2,3,4,5}; extern int x,y; 说明 a,b 为静态类型变量 说明 c1,c2 为自动字符变量 说明 a 为静整型数组 说明 x,y 为外部整型变量。
总结与区别: 变量根 据定义的位置的不同 的生命周 期, 具有不同的 作用域, 作用域可分为 6 种: 全局作用域,局部作用域,语句作用域, 类作用域,命名空间作用域和文件作用域。 从作用域看: 全局变量具有全局作用域。全局变量只需 在一个源文件 中定义,就可 以作用于所有的源文件。当然,其 他不包含全局变量定义的源 文件需 要用 extern 关键字再次声 明这个全局变量。 静态局部变量具有局部作用域,它只 被初始化一次,自从第一次被初 始化直到程序运行结束都一直存在, 它和全局变量的区别在于 全局变 量对所有的函数都是可见的, 而静态局部变量只 对定义自己的函数体 始终可见。
二、介绍变量的作用域 在讨论函数的 形参 变量时曾经提 到, 形参 变量只在 被调 用期间才分 配内存单元, 调用结束立即释放。 这一点 表明形参 变量只有在函数 内才 是有效的, 离开 该函数就不能再使用了。这种 变量有效性的范 围称 变量的作用域。不仅对于形参变量, C 语言中所有的量都有自 己的作用域。变量 说明的方式不 同,其作用域 也不 同。 C 语言中的 变量,按作用域范围可分为两种, 即局部变量和全局变量。 一、局部变量 局部变量也称为内部变量。局部变量是在函数内作定义说明的。 其作用域仅限于函数内, 离开 该函数后再使用这种变量是非法 的。 例如: int f1(int a) /*函数 f1*/ { int b,c; …… }a,b,c 作用域 int f2(int x) /*函数 f2*/ { int y,z; }x,y,z 作用域 main() {
静态存储变量通 常 是在变量定义 时就 分定存储单元 并一 直保持 不变, 直至 整个程序结束。 5.5.1 节中介绍的全局变量 即属于此类 存储方式。动态存储变量是在程序执 行过 程中 ,使用它时才分配存储 单元, 使用完毕立即释放。 典 型的例子 是函数的形式参数,在函数 定义时并不给形参分配存储单元, 只是在函数被调用时, 才予以分配, 调用函数完毕立即释放。如果一个函数被多次调用,则反复地分配、 释放 形参变量的存储单元。从以 上分 析可知, 静态存储变量是一直 存在的, 而动态存储变量则时而存在时而 消失。我 们又 把这种由于 变量存储方式 不同 而产生的 特性称变量的 生存 期。 生存 期表 示了变 量存在的时间 。 生存 期和作用域是从时间 和空间这两个不同的角度 来描述变量的 特性 ,这两者 既有 联系,又 有区别。 一个变量 究竟属 于哪 一种存储 方式 , 并不能仅从其作用域 来判断, 还应 有明确的存 储类型说明。 在 C 语言中,对变量的存储类型说明 有以下四种: auto register extern static 自动变量 寄存器变量 外部变量 静态变量
} printf("%d\n%d\n",i,k); } 本程序在 main 中定义了 i,j,k 三个变量,其中 k 未赋初值。 而 在复合语句内又定义了一个变量 k, 并赋 初值为 8。应该注意这两个 k 不是同一个变量。在 复合语句外由 main 定义的 k 起作用,而在复 合语句内则由在复合语句内定义的 k 起作用。 因此程序第 4 行的 k 为 main 所 定义,其值应为 5。第 7 行输出 k 值,该行在复合语 句内,由 复合语句内定义的 k 起 作用,其初值为 8,故输出 值为 8,第 9 行输 出 i,k 值。i 是在整个程序中有效的,第 7 行对 i 赋值为 3,故以 输 出也为 3。而第 9 行已在 复合语句之外,输出的 k 应为 main 所定义 的 k,此 k 值由第 4 行已获得为 5,故输出也为 5。 二、全局变量 全局变量 也称 为外部变量,它是在函数外部定义的变量。 它不 属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。 在函数中使用全局变量,一 般应 作全局变量说明。 只有在函数内经 过说明的全局变量才能使用。全局变量的说明符为 extern。 但在一 个函数之前定义的全局变量,在该函数内 使用可不 再加以说明。 例 如: int a,b; /*外部变量 */ void f1() /*函数 f1*/ {
1. 对于 局部变量的定义和说明,可以不加区分。而 对于外部变 量则不然,外部变量的定义和外部变量的 说明并不是一回事。外部变 量定义 必须在 所 有的函数 之外, 且只 能定义一次。其一 般形式 为: [extern] 类型说明符 变量名, 变量名… 其中方 括号内的 extern 可 以省去不写。 例如: int a,b; 等效于: extern int a,b; 而外部变量说明出现在 要使 用该外部变量的各 个函数内, 在整 个程序内,可能出现多次,外部变量说明 的一般形式为: extern 类 型说明符 变量名 ,变量名,… ; 外部变量在定义时就已分配了内存 单元, 外部变量定义可作初始赋值,外部变量说明不能再赋初始值, 只是表明在函数内要使用某外部变量。 2. 外部变量可加强函数模块之间的数据联系, 但是又使函数要 依赖这些变量,因而使 得函数的 **性 降低 。从模块化程序设计 的观点 来看这是不利的, 因此在不必 要时尽量不要使用全局变量。 3. 在同 一源文件 中, 允许全局变量和局部变量 同名 。在局部变 量的作用域内,全局变量不起作用。 [例 5.13] int vs(int l,int w) { extern int h;
…… } float x,y; /*外部变量*/ int fz() /*函数 fz*/ { …… } main() /*主 函数 */ { …… }/*全局变量 x,y 作用域 全局变量 a,b 作用域*/ 从上例可以 看出 a、b、x、 y 都是在函数外部定义的外部变量, 都是全局变量。但 x,y 定义在函数 f1 之 后,而在 f1 内又无对 x,y 的说明,所以它们在 f1 内无效。 a,b 定义在源 程序最前面,因此 在 f1,f2 及 main 内不加 说明也可使用。 [ 例 5.12] 输 入 正 方 体 的 长 宽 高 l,w,h 。 求 体 积 及 三 个 面 x*y,x*z,y*z 的面积。 int s1,s2,s3; int vs( int a,int b,int c) { int v; v=a*b*c;
全局变量与局部变量的区别
全局变量与局部变量的区别 一、变量的分类 变量可以分为: 全局变量、 静态全局变量、 静态局部变量和局部变量。 按存储区域分,全局变量、静态全局变量和静态局部变量都存放在内 存的静态存储区域,局部变量存放在内存的栈区。 按作用域分,全局变量在整个工程文件内都有效;静态全局变量只在 定义它的文件内有效;静态局部变量只在定义它的函数内有效,只是 程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定 义它的函数内有效,但是函数返回后失效。 全局变量和静态变量如果没有手工初始化,则由编译器初始化为 0。 局部变量的值不可知。 静态全局变量,只本文件可以用。 全局变量是没有定义存储类型的外部变量 ,其作用域是从定义点到程 序结束.省略了存储类型符 ,系统将默认为是自动型 . 静态全局变量是定义存储类型为静态型的外部变量 ,其作用域是从定 义点到程序结束 ,所 不 同 的是存储类型 决 定了存储 地 点 ,静态型变量 是存放在内存的数 据区中的 ,它们在程序开 始运行前就分配了固定的 字节 ,在程序运行过 程 中被 分配的字节大小 是不 改 变的 .只有程序 运 行结束后,才释放 所占用的内存 . 自动型变量存放在 堆 栈区 中 .堆 栈区 也 是内存 中 一部分 ,该部分内存 在程序运行中是重复使用的.
s1=a*b; s2=b*c; s3=a*c; return v; } main() { int v,l,w,h; printf("\ninput length,width and height\n"); scanf("%d%d%d",&l,&w,&h); v=vs(l,w,h); printf("v=%d s1=%d s2=%d s3=%d\n",v,s1,s2,s3); } 本程序中定义了三个外部变量 s1,s2,s3, 用 来存放三个面积, 其作用域为整个程序。函数 vs 用来求正方 体体积和三个 面积, 函数 的返回值为体积 v。由 主函数完成长宽高 的输入及结果 输出。由于 C 语言 规定函数返回值只有一个, 当需要增加函数的返回数据时,用 外部变量是一 种很好的方式 。本 例中 ,如不使 用外部变量, 在主函 数中就不可能取得 v,s1,s2,s3 四个值。而采用了外部变量, 在函数 vs 中求得的 s1,s2,s3 值在 main 中仍然有效。 因此外部变量是实现 函数之间数据通讯的有效手段。对于全局变量还有以下几点说明:
int v; v=l*w*h; return v; } main() { extern int w,h; int l=5; printf("v=%d",vs(l,w)); } int l=3,w=4,h=5; 本例程序 中,外部变量在最 后定义, 因此 在前面函数中对要用 的外部变量必须进行说明。外部变量 l, w 和 vs 函数的形参 l,w 同 名。外部变量都作了初始赋值,mian 函数中也对 l 作了初始化 赋值。 执行程序时,在 printf 语句中调用 vs 函数,实参 l 的值应为 main 中定义的 l 值,等 于 5,外部变量 l 在 main 内不 起作用;实参 w 的 值为外部变量 w 的值为 4,进入 vs 后这两个值传送给形参 l,wvs 函 数中使用的 h 为外部变量,其值为 5,因此 v 的 计算结果为 100,返 回主 函数后输出。变量的存储类型各 种变量的作用域不同, 就其本 质来说是因变量的存储类型相同。 所谓存储类型是指变量占用内存空 间的方式, 也称 为存储方式。 变量的存储 方式可分为“静态存储”和“动态存储”两种。
int m,n; } m,n 作用域 在函数 f1 内定义了三个变量, a 为形参, b,c 为一 般变量。在 f1 的范围内 a,b,c 有效,或者说 a,b,c 变量的作用域限 于 f1 内。同理,x,y,z 的作用域限于 f2 内。 m,n 的作用域限于 main 函数内。关于局部变量的作用域还要说明以下几点: 1. 主函数中定义的变量也只 能在主函数中使用,不 能在其它函 数中使用。同时 ,主函数中也不 能使用其它函数中定义的变量。因 为 主函数也是一个函数,它与其它函数是平行关系。这一点是与其它语 言不同的,应予以注意。 2. 形参 变量是属于被调函数的局部变量,实参 变量是属于主调 函数的局部变量。 3. 允许 在不同的函数 中使用 相同的变量名,它 们代表不同的对 象,分配不 同的单元,互不干扰,也不会发生混淆。如在例 5.3 中, 形参 和实参的变量 名都为 n,是 完全允许 的。 4. 在 复合语句 中也 可 定义变量,其作用域只在复合语句范围内。例如: main() { int s,a; …… { int b;