




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1第1页,课件共35页,创作于2023年2月变量的属性数据类型:变量所持有的数据的性质(操作属性)存储属性:存储器类型:寄存器、静态存储区、动态存储区生存期:变量在某一时刻存在——静态变量与动态变量作用域:变量在某区域内有效——局部变量与全局变量变量定义格式:[存储类型]数据类型变量表;例:intsum;externinta,b,c;registerinti;staticfloatx,y;第2页,课件共35页,创作于2023年2月变量的作用域变量的作用域:变量有效的范围。C语言中所有的变量都有自己的作用域。变量说明的方式不同,其作用域也不同。C语言的变量,按作用域范围可分为两种:局部变量和全局变量。3第3页,课件共35页,创作于2023年2月局部变量—内部变量定义:在函数内定义,只在本函数内有效说明:main中定义的变量只在main中有效不同函数中同名变量,占不同内存单元形参属于局部变量可定义在复合语句中有效的局部变量floatf1(inta){intb,c;…….}charf2(intx,inty){inti,j;……}main(){intm,n;…….}a,b,c有效x,y,i,j有效m,n有效4第4页,课件共35页,创作于2023年2月例:不同函数中同名变量main(){inta,b;a=3;b=4;printf("main:a=%d,b=%d\n",a,b);sub();printf("main:a=%d,b=%d\n",a,b);}sub(){inta,b;a=6;b=7;printf("sub:a=%d,b=%d\n",a,b);}运行结果:main:a=3,b=4sub:a=6,b=7main:a=3,b=45第5页,课件共35页,创作于2023年2月全局变量—外部变量定义:在函数外定义,可为本文件所有函数共用。有效范围:从定义变量的位置开始到本源文件结束,及有extern声明的其它源文件。应尽量少使用全局变量,因为:全局变量在程序全部执行过程中占用存储单元降低了函数的通用性、可靠性,可移植性降低程序清晰性,容易出错
定义
声明次数:只能1次可声明多次位置:所有函数之外函数内或函数外分配内存:分配内存,可初始化不分配内存,不可初始化
外部变量声明:extern数据类型变量表;外部变量定义与外部变量声明不同
若外部变量与局部变量同名,则外部变量被屏蔽6第6页,课件共35页,创作于2023年2月inta=3,b=5;max(inta,intb){intc;c=a>b?a:b;return(c);}main(){
inta=8;printf("max=%d",max(a,b));}例:外部变量与局部变量运行结果:max=8例:外部变量定义与声明externinta,b;intmax(){intz;
z=a>b?a:b;return(z);}main(){printf("max=%d",max());}inta=13,b=-8;外部变量定义及初始化外部变量声明运行结果:max=137第7页,课件共35页,创作于2023年2月intp=1,q=5;floatf1(inta){intb,c;…….}intf3(){…..}charc1,c2;charf2(intx,inty){inti,j;……}main(){intm,n;…….}c1,c2的作用范围p,q的作用范围externcharc1,c2;externcharc1,c2;c1,c2的作用范围扩展后c1,c2的作用范围扩展后8第8页,课件共35页,创作于2023年2月void
main(){voidgx(),gy();
externintx,y;printf(“1:x=%d\ty=%d\n”,x,y);y=246;gx();gy();}voidgx(){
externintx,y;x=135;printf(“2:x=%d\ty=%d\n”,x,y);}intx,y;voidgy(){printf(“3:x=%d\ty=%d\n”,x,y);}例:用extern扩展外部变量作用域运行结果:1:x=0y=02:x=135y=2463:x=135y=2469第9页,课件共35页,创作于2023年2月引用其它文件中的外部变量intglobal;externfloatx;main(){intlocal; . .}externintglobal;staticintnumber;func2(){ . . .}floatx;unc3(){
externintglobal;...}file1.cfile2.cfile3.c10第10页,课件共35页,创作于2023年2月变量的存储类型程序区静态存储区动态存储区全局变量、局部静态变量形参变量局部动态变量(autoregister)函数调用现场保护和返回地址等内存用户区11第11页,课件共35页,创作于2023年2月动态变量与静态变量存储方式静态存储:程序运行期间分配固定存储空间动态存储:程序运行期间根据需要动态分配存储空间
生存期静态变量:从程序开始执行到程序结束动态变量:从包含该变量定义的函数开始执行至函数执行结束
变量的存储类型
auto-----自动型register-----寄存器型static------静态型extern-----外部型12第12页,课件共35页,创作于2023年2月变量存储类型静态动态存储方式程序整个运行期间函数调用开始至结束生存期编译时赋初值,只赋一次
每次函数调用时赋初值自动赋初值0或空字符不确定未赋初值静态存储区动态区存储区寄存器局部变量外部变量作用域定义变量的函数或复合语句内本文件其它文件局部变量默认为auto型register型变量个数受限,且不能为long,double,float型局部static变量具有全局寿命和局部可见性局部static变量具有可继承性extern不用于变量定义,可扩展外部变量作用域register局部staticauto外部static外部存储类别13第13页,课件共35页,创作于2023年2月例:文件file1.cinta;main(){…….f2;…….f1;…….}f1(){autointb;………f2;……..}f2(){
staticintc;………}C作用域b作用域a作用域mainf2f1mainf1f2maina生存期:b生存期:c生存期:14第14页,课件共35页,创作于2023年2月main(){
voidincrement(void);increment();increment();increment();}voidincrement(void){intx=0;x++;printf(“%d\n”,x);}例:局部静态变量值具有可继承性运行结果:111main(){
voidincrement(void);increment();increment();increment();}voidincrement(void){staticintx=0;x++;printf(“%d\n”,x);}运行结果:12315第15页,课件共35页,创作于2023年2月例:变量的寿命与可见性#include<stdio.h>inti=1;main(){staticinta;
registerintb=-10;
intc=0;printf("-----MAIN------\n");printf("i:%da:%d\b:%dc:%d\n",i,a,b,c);c=c+8;other();printf("-----MAIN------\n");printf("i:%da:%d\b:%dc:%d\n",i,a,b,c);i=i+10;
other();}other(){staticinta=2;staticintb;
intc=10;a=a+2;i=i+32;c=c+5;printf("-----OTHER------\n");printf("i:%da:%d\b:%dc:%d\n",i,a,b,c);b=a;}-------Main------i:1a:0b:-10c:0------Other------i:33a:4b:0c:15-------Main-----i:33a:0b:-10c:8-------Other-------i:75a:6b:4c:15全局i1main:a0b:-10registermain:c0静态存储区动态存储区other:a2other:b0other:c10843315443other:c1067515616第16页,课件共35页,创作于2023年2月
#include<stdio.h>
inti=10;
intmain()
{
inti=1;
printf("%d\t",i);
{
inti=2;
pritnf("%d\t",i);
{
externi;
i+=1;
printf("%d\t",i);
}
printf("%d\t",++i);
}
printf("%d\n",++i);
}运行结果为:
1
2
11
3
2
例:
17第17页,课件共35页,创作于2023年2月内存动态申请和释放void*malloc(unsignedintsize)
在动态存储区分配长度为size的连续空间,并返回指向该空间起始地址的指针。若分配失败(系统不能提供所需内存),则返回空指针(NULL)。例:int*p=(int*)malloc(sizeof(int)*length);voidfree(void*ptr)
释放ptr指向的内存空间。ptr是malloc()函数返回的值。例:free(p);18第18页,课件共35页,创作于2023年2月内部函数和外部函数函数一旦定义后就可被其它函数调用。但当一个源程序由多个源文件组成时,在一个源文件中定义的函数能否被其它源文件中的函数调用呢?C语言把函数分为两类:内部函数外部函数19第19页,课件共35页,创作于2023年2月内部函数如果在一个源文件中定义的函数只能被本文件中的函数调用,而不能被同一源程序其它文件中的函数调用,这种函数称为内部函数。定义内部函数的一般形式是:
static类型说明符函数名(形参表)
例如:staticintf(inta,intb)内部函数也称为静态函数。但此处静态static的含义已不是指存储方式,而是指对函数的调用范围只局限于本文件。20第20页,课件共35页,创作于2023年2月外部函数外部函数在整个源程序中都有效,其定义的一般形式为:
extern类型说明符函数名(形参表)
例如:externintf(inta,intb)如在函数定义中没有说明extern或static则隐含为extern。在一个源文件的函数中调用其它源文件中定义的外部函数时,应用extern说明被调函数为外部函数。21第21页,课件共35页,创作于2023年2月小结可从三个方面对变量分类,即变量的数据类型,变量作用域和变量的存储类型。在第二章中主要介绍变量的数据类型,本章中介绍了变量的作用域和变量的存储类型。变量的作用域是指变量在程序中的有效范围,分为局部变量和全局变量。变量的存储类型是指变量在内存中的存储方式,分为静态存储和动态存储,表示了变量的生存期。22第22页,课件共35页,创作于2023年2月作用:对源程序编译之前做一些处理,有助于提高程序的可移植性、灵活性及编译效率。主要有:宏定义#define文件包含#include条件编译#if--#else--#endif等格式:“#”开头占单独书写行语句尾不加分号预处理概述23第23页,课件共35页,创作于2023年2月宏定义一、不带参数宏定义一般形式:#define宏名[宏体]功能:用指定标识符(宏名)代替字符序列(宏体)宏体可缺省,表示宏名定义过或取消宏体如#defineYES1#defineNO0#definePI3.1415926#defineOUTprintf(“Hello,World”);24第24页,课件共35页,创作于2023年2月如if(x==YES)printf(“correct!\n”);
elseif(x==NO)printf(“error!\n”);展开后:if(x==1)printf(“correct!\n”);
elseif(x==0)printf(“error!\n”);宏展开:预编译时,用宏体替换宏名---不作语法检查定义位置:任意(一般在函数外面)作用域:从定义命令到文件结束#undef可终止宏名作用域格式:
#undef宏名例#defineYES1
main(){……..}#undefYES#defineYES0
max(){……..}YES原作用域YES新作用域宏定义可嵌套,不能递归例#defineMAXMAX+10(
)引号中的内容与宏名相同也不置换例#define
PI
3.14159
printf(“2*PI=%f\n”,PI*2);宏展开:printf(“2*PI=%f\n”,3.14159*2);宏定义中使用必要的括号()例#defineWIDTH80
#define
LENGTHWIDTH+40
var=LENGTH*2;宏展开:var=80+40*2;()()例#define
WIDTH
80#define
LENGTH
WIDTH+40
var=LENGTH*2;宏展开:var=80+40*2;25第25页,课件共35页,创作于2023年2月二、带参数宏定义一般形式:#define宏名(参数表)宏体例#defineS(r)PI*r*r相当于定义了不带参宏S,代表字符串“(r)PI*r*r”
宏展开:形参用实参换,其它字符保留宏体及各形参外一般应加括号()例#defineS(a,b)a*b………..area=S(3,2);宏展开:area=3*2;不能加空格例#definePOWER(x)x*xx=4;y=6;z=POWER(x+y);宏展开:z=x+y*x+y;一般写成:#definePOWER(x)
((x)*(x))宏展开:z=((x+y)*(x+y));26第26页,课件共35页,创作于2023年2月#defineMAX(x,y)(x)>(y)?(x):(y)
…….main(){inta,b,c,d,t;…….t=MAX(a+b,c+d);……}宏展开:t=(a+b)>(c+d)?(a+b):(c+d);intmax(intx,inty){return(x>y?x:y);}main(){inta,b,c,d,t;…….t=max(a+b,c+d);………}例:用宏定义和函数实现同样的功能27第27页,课件共35页,创作于2023年2月带参数宏与函数的区别带参数宏函数处理过程不分配内存简单的字符置换分配内存先求实参值,再代入形参处理时间编译时程序运行时参数类型无类型问题定义实参,形参类型程序长度变长不变运行速度不占运行时间调用和返回占时间28第28页,课件共35页,创作于2023年2月文件包含功能:一个源文件可将另一个源文件的内容全部包含进来一般形式:#include“文件名”或#include<文件名>#include“file2.c”file1.cfile2.cfile1.cfile2.cABA处理过程:预编译时,用被包含文件的内容取代该预处理命令,再对“包含”后的文件作一个源文件编译。<>直接按标准目录搜索“”
先在当前目录搜索,再搜索标准目录,
文件名可指定路径29第29页,课件共35页,创作于2023年2月被包含文件内容源文件(*.c)头文件(*.h)宏定义数据结构定义函数声明等文件包含可嵌套#include“file2.c”file1.cAfile3.hC#include“file3.h”file2.c
Bfile1.cAfile3.hfile2.c调用库函数加强类型检查提高程序可读性30第30页,课件共35页,创作于2023年2月文件包含举例/*powers.h*/#definesqr(x)((x)*(x))#definecube(x)((x)*(x)*(x))#definequad(x)((x)*(x)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国安全教育试题及答案
- 浙江省乐清外国语学院2025届物理高二第二学期期末经典试题含解析
- 重庆市开州区开州中学2025年生物高二第二学期期末质量跟踪监视模拟试题含解析
- 浙江省杭州市名校协作体2025届生物高二下期末复习检测试题含解析
- 云南省耿马县第一中学2025届高二数学第二学期期末统考试题含解析
- 生态小区物业管理与生态保护合同范本
- 体育馆场租赁合同范本及服务条款
- 房地产项目财务担保贷款合同风险管理协议
- 餐饮酒店与体育赛事餐饮赞助合同
- 跨境电商物流中心厂房土地租赁及仓储服务合同
- 2025年物联网工程师考试试题及答案
- 宣城郎溪开创控股集团有限公司下属子公司招聘笔试题库2025
- 2025年高尔夫教练职业资格考试试卷及答案
- 汽车挂靠合同终止协议书
- 抖音合作合同协议书
- 肥胖症诊疗指南(2024年版)解读
- 2024北京西城区六年级(下)期末数学试题及答案
- 公安保密知识培训
- 2024北京西城区五年级(下)期末英语试题及答案
- 香烟采购合同协议
- 邮政面试试题及答案
评论
0/150
提交评论