为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

第15章、变量作用域和生存期(理论课)

2012-12-13 28页 ppt 336KB 14阅读

用户头像

is_431379

暂无简介

举报
第15章、变量作用域和生存期(理论课)null使用C语言开发简单应用使用C语言开发简单应用第十五章 变量作用域和生存期上一章内容回顾上一章内容回顾函数定义 函数声明和函数原型 函数调用 函数的嵌套调用 函数的递归调用 文件包含 内部函数和外部函数 多文件程序编制 使用函数时应注意的问题 本章学习目标本章学习目标理解变量的作用域 局部变量 全局变量 理解变量的生存期 静态存储方式 动态存储方式 理解变量的存储类别 自动的(auto) 静态的(static) 寄存器(register) 外部的(extern) 理解静态局部变量内容进度内容进度变量的作用域 局部变...
第15章、变量作用域和生存期(理论课)
null使用C语言开发简单应用使用C语言开发简单应用第十五章 变量作用域和生存期上一章内容回顾上一章内容回顾函数定义 函数声明和函数原型 函数调用 函数的嵌套调用 函数的递归调用 文件包含 内部函数和外部函数 多文件程序编制 使用函数时应注意的问题 本章学习目标本章学习目标理解变量的作用域 局部变量 全局变量 理解变量的生存期 静态存储方式 动态存储方式 理解变量的存储类别 自动的(auto) 静态的(static) 寄存器(register) 外部的(extern) 理解静态局部变量内容进度内容进度变量的作用域 局部变量 全局变量 变量的生存期 存储方式 静态存储方式 动态存储方式 存储类别 自动的(auto) 静态的(static) 寄存器(register) 外部的(extern)局部变量局部变量定义: 在函数内或语句块内定义,只在本函数或本语句块内有效。 说明: 不同函数或语句块可以定义同名的局部变量,分配不同的存储单元,互不干扰,不会发生混淆 函数的形参是局部变量,只能在函数内使用局部变量局部变量举例: #include void main() { int i=3; int j=5; int k=0; //函数内局部变量 k=i+j; { int k=10; //语句块内局部变量 printf("%d\n",k); } printf("%d\n",k); }内容进度内容进度变量的作用域 局部变量 全局变量 变量的生存期 存储方式 静态存储方式 动态存储方式 存储类别 自动的(auto) 静态的(static) 寄存器(register) 外部的(extern)全局变量全局变量定义: 在所有函数外部定义的变量,有效范围从定义/声明的位置到本文件结束。 举例: 说明: 若全局变量与局部变量同名,则全局变量将被屏蔽。 当一个程序的许多函数都是使用一个全局变量时,全局变量为编程提供了方便。 但是应该避免不必要地使用全局变量,因为: 全局变量在程序的执行期间都占用内存,如果定义很多全局变量,则系统运行中需要消耗较多的内存 会降低函数的通用性、可靠性、可移植性 会降低程序清晰性,容易出错全局变量全局变量应用举例1:#include /*全局变量*/ int a=5; int b=10; void fun(void) { int c; c=a; a=b; b=c; } void main() { printf("a=%d,b=%d\n",a,b); fun(); printf("a=%d,b=%d\n",a,b); }全局变量全局变量应用举例2:#include int a=3; int b=5; int max(int a, int b) { int c; c=a>b?a:b; return(c); } void main() { int a=8; printf("max=%d\n",max(a,b)); }全局变量全局变量应用举例3:#include int i; void main() { void prt(); for(i=0;i<5;i++) prt(); } void prt() { for(i=0;i<5;i++) printf("%c",'*'); printf("\n"); }内容进度内容进度变量的作用域 局部变量 全局变量 变量的生存期 存储方式 静态存储方式 动态存储方式 存储类别 自动的(auto) 静态的(static) 寄存器(register) 外部的(extern)变量的存储方式变量的存储方式静态存储方式: 在程序运行期间分配固定的存储空间的方式。 静态存储区: 全局变量 静态局部变量 动态存储方式: 在程序运行期间根据需要动态地分配存储空间的方式。 动态存储区: 函数形参 函数调用时的现场保护和返回地址 非静态局部变量 内容进度内容进度变量的作用域 局部变量 全局变量 变量的生存期 存储方式 静态存储方式 动态存储方式 存储类别 自动的(auto) 静态的(static) 寄存器(register) 外部的(extern)变量的存储类别变量的存储类别存储类别: 自动的(auto) 静态的(static) 寄存器(register) 外部的(extern) 变量定义: 一般形式:[存储类别] 数据类型 变量; 举例: int sum; auto int a; register int i; static float x; extern char ch;auto变量auto变量说明: 动态存储方式,存储在动态存储区 局部变量定义中存储类别省略时,默认为auto型 auto型变量在函数/语句块被调用时分配内存,每次调用都重新分配,重新赋初值,调用结束则释放空间。 auto型变量如果不赋初值,则其值是一个不确定的值。静态局部变量静态局部变量举例: 说明: 静态存储方式,在静态存储区分配单元,在程序运行期间都不释放。 静态局部变量具有可继承性,在整个程序运行期间只赋一次初值,以后调用不在重新赋初值,而只是保留上次调用后的值。 在定义时如果没有赋初值,则自动赋初值为该类型的零值。 静态局部变量具有全局的寿命和局部的可见性,作用域仍然是该函数/语句块内。#include void main() { void Adda(void); int i=0; for( i=0; i<3; i++ ) Adda(); } void Adda(void) { static int x=0; int y=1; int z=0; x++; y++; z=x+y; printf("x=%d,y=%d,z=%d\n",x,y,z); }静态局部变量静态局部变量应用举例:输出1~5的阶乘。#include int fac(int n) { static int f=1; f=f*n; return f; } void main() { int i; for(i=1; i<6; i++) printf("%d!=%d\n",i,fac(i)); }register变量register变量说明: 只有非静态局部变量和形参可定义为register变量,全局变量和静态局部变量不能定义为register变量。 一个系统中的寄存器数目是有限的,不能定义任意多个register变量。 在实践中很少使用register变量,因为目前很多编译器都具有优化选项,会自动把一些频繁使用的变量放在寄存器中以提高效率。用extern声明外部变量用extern声明外部变量在一个文件内声明外部变量 在多个文件中声明外部变量 #include void Demo(void) { extern int x,y; int a=10,b=10; x=a-b; y=a+b; printf("DEMO:%d,%d\n",x,y); } void main() { int a=9, b=5; extern int x,y; x=a+b; y=a-b; printf("MAIN:%d,%d\n",x,y); Demo(); printf("MAIN:%d,%d\n",x,y); } int x,y;用static修饰全局变量用static修饰全局变量作用: 使全局变量只限于本文件使用,其他文件不能引用,可以防止其他程序无意中错误地引用了全局变量。 举例:小结小结应用举例应用举例#include int i=1; void other() { static int a=2; static int b; int c=10; a=a+2; i=i+32; c=c+5; printf("-----OTHER------\n"); printf("i:%d a:%d b:%d c:%d\n",i,a,b,c); b=a; }void main() { static int a; register int b=-10; int c=0; printf("-----MAIN------\n"); printf("i:%d a:%d b:%d c:%d\n",i,a,b,c); c=c+8; other(); printf("-----MAIN------\n"); printf("i:%d a:%d b:%d c:%d\n",i,a,b,c); i=i+10; other(); }应用举例应用举例:-------Main------ i:1 a:0 b:-10 c:0 ------Other------ i:33 a:4 b:0 c:15 -------Main----- i:33 a:0 b:-10 c:8-------Other------- i:75 a:6 b:4 c:15843315443675156本章内容总结本章内容总结对变量的定义,有两种属性:数据类型和存储类别,例如: static int x;(定义静态局部变量或定义限于本文件使用的全局变量) auto int y;(定义自动变量,即局部变量) regiter int a;(定义寄存器变量,函数内部定义) extern int b;(定义可被外文件引用的全局变量或声明已经定义的全局变量) 本章内容总结本章内容总结从作用域角度分为:局部变量和全局变量。 局部变量: 自动变量:存储在动态存储区中,离开函数,值就消失; 静态局部变量:存储在静态存储区中,离开函数,值仍保留; 寄存器变量:存储在寄存器中,离开函数,值就消失; 形参:被看做局部变量,可以定义为自动变量或寄存器变量。 全局变量: 使用extern扩展作用域 使用static限制作用域 本章内容总结本章内容总结从变量的生存期区分:动态存储方式和静态存储方式。 静态存储方式是在程序整个运行期间都存在,而动态存储方式是在调用函数时临时分配单元。 动态存储: 自动变量 寄存器变量 形参 静态存储: 静态局部变量 全局变量本章内容总结本章内容总结int a; main( ) { ……. ……. f2; ……. f1; ……. } f1( ) { auto int b; ……… f2; …….. } f2( ) { static int c; ……… }
/
本文档为【第15章、变量作用域和生存期(理论课)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
热门搜索

历史搜索

    清空历史搜索