C面向过程的程序设计.ppt

上传人:tia****nde 文档编号:11495521 上传时间:2020-04-25 格式:PPT 页数:68 大小:583KB
返回 下载 相关 举报
C面向过程的程序设计.ppt_第1页
第1页 / 共68页
C面向过程的程序设计.ppt_第2页
第2页 / 共68页
C面向过程的程序设计.ppt_第3页
第3页 / 共68页
点击查看更多>>
资源描述
C+面向过程的程序设计,第02章,主要内容,标识符与关键字,标识符避免使用下面的名称C+语言系统的关键字,如double、void等,具体见Page6C+标准类库或对象,如cin和coutC语言中标准库函数名,如printfVC规定标识符的名称最长为247个,最好做到“见名知义”。,一些标识符示例,Dram_rectangle_myfriend1_peointmy$printf,X,X,X,不好,主要内容,1、基本数据类型,字符型:char整型:short、int、long(带符号型)无符号型:unsignedint等浮点型floatdoublelongdouble布尔型:bool,取值true和false,1字节,基本数据类型说明,bool型的true实际存储为1,false存储为0不同系统对同一类型的长度定义不等,避免使用int,而是明确使用short或long等类型float和double型不能用signed或unsigned修饰,2、结构的使用,C风格的结构体structpointintx;inty;C风格结构体变量定义structpointpoint1=3,5;,2、结构的使用,C+风格的结构体变量定义structpointintx;inty;pointpoint1=3,5;,point直接作为类型名称;联合和枚举的用法类似,3、两种风格的强制类型转换,C风格:(数据类型)表达式floata=3.6,b=2.5;intc=(int)a+b;intc=(int)(a+b);C+风格:数据类型(表达式)intc=int(a+b);,5c,6c,6c,看成是int函数调用,隐式数据类型转换,赋值转换表达式求值转换返回值类型转换intadd(doublex,doubley)returnx+y;coutadd(2.5+3.2)endl;,运行结果5,主要内容,1、常量,字面常量整型常量十进制:34、-28八进制:045十六进制:0 x7B长整型后缀为l或L,无符号整型后缀u或U浮点型常量十进制形式:0.12、.13指数形式:1.2e9float后缀f或F,double后缀l或L,常量,字面常量字符常量A、c转义字符:n,具体见Page24字符串常量“HelloWorld”比较:0、0、0、“0”,常量,符号常量#definePI3.1415926命名常量定义:推荐使用constintArraySize=100;intarrayArraySize;constfloatPI=3.1415926;,常量示例,#defineP1voidmain()floatf=1.0;coutf+P/2endl;,运行结果1.0,constfloatP=1;,运行结果1.5,2、变量,赋值与初始化inti;i=5;inti=6;,程序运行时决定,编译时决定,变量定义的位置,C+的初始化inti(5);变量定义的位置C语言:集中先定义,之后为语句C+:可以随时定义,也要遵循先定义后使用的原则,:运算符,【示例2.2】全局变量访问#includeusingnamespacestd;intx=6;/全局变量voidmain()intx=1;coutxendl;/访问局部变量cout:xendl;/访问全局变量,运行结果16,主要内容,1、指针变量,地址的概念定义一个变量,程序执行后数据会加载到内存中的某个地方,计算机如何找到这个地方?地址:内存按字节编号,0、1、2存储单元的编号就是该单元的地址,它表明了该存储单元在内存中的位置系统根据变量的地址而不是任何别的东西寻找某个变量。变量的地址:变量占用的首个存储单元的地址,变量的地址,变量的地址变量a占用的是内存的20002003四个单元,变量a的地址为2000。源代码中写a=5;我们可以理解为将5赋给变量a;而计算机在执行程序时,只是将5送入20002003四个存储单元中。,指针变量,inta=5;int*pa;pa=指针变量pa指向变量a,2、指针变量的使用要点,引用前一定要初始化inta=5;int*pa;/pa=,指针变量的使用要点,数据类型要匹配指针变量的数据类型,必须与其所指向的变量的数据类型一致。不可以在不同类型指针变量之间赋值。指针变量中存储的是一个表示地址的整数值,但不可以将一个整数值直接赋给指针变量。,指针变量的使用要点,void指针及强制类型转换inta=7,*pa=,任意类型指针都可赋值给void类型,符合原来的类型,3、指针与一维数组,通过下标访问数组元素inta10;intk;for(k=0;k10;k+)ak=k;,程序员负责检查下标是否越界!,指针与一维数组,通过数组名访问数组元素inta10;intk;for(k=0;k10;k+)*(a+k)=k;,指针与一维数组,通过指针变量访问数组元素inta10;intk,*p;p=a;for(k=0;k10;k+)*(p+k)=k;,或p=,或者pk=k;,指针与一维数组,指针变量和数组名的使用区别akpk*(a+k)*(p+k)for(k=0;k10;k+)*p+=k;,a不能被改变,X,*a+=k;,4、指向数组的指针,数据类型(*指针变量名)常量表达式inta23=;int(*p)3;p=a;for(inti=0;i2;i+)for(intj=0;j3;j+)pij=,指向数组的指针常用于指向二维数组,指向数组的指针,访问数组元素的其它方式aijpij*(ai+j)*(pi+j)*(*(a+i)+j)*(*(p+i)+j),5、指针数组,数据类型*变量名常量表达式inta,b,c,d;int*p4=,定义含4个元素的指针数组,p只是数组名,pa是指针变量,指向含3个int元素的一维数组,6、二级指针,指向指针的指针inta=a;int*pa=,二级指针示例,经常与指针数组配合使用char*p;char*name=“hello”,“good”,“world”,“bye”,“”;p=name;while(*p!=NULL)cout*p+endl;,运行结果hellogoodworldbye,判断第一个字符是否为0,7、动态内存分配,内存布局全局变量静态数据区,在main或WinMain前完成地址空间分配并初始化。静态变量静态数据区,第一次使用时分配地址空间并初始化,静态数据区在程序退出后由操作系统释放。动态请求堆,C中的malloc和free,C+中的new和delete,运行时确定,程序员维护局部变量和函数参数栈中,函数被调用时确定,操作系统自动维护,动态内存分配,开辟某种类型的单个空间int*p;if(p=newint)=NULL)cout“error”endl;exit(0);*p=5;deletep;,用相同类型的指针接收,malloc返回void*,动态内存分配,开辟带初值的某种类型的单个空间int*p;p=newint(5);cout*pendl;deletep;,分配空间并初始化为5,动态内存分配,开辟多个元素的空间int*p;p=newint10;*p=5;p+;*p=6;deletep;,分配10个int元素空间不能初始化,删除多个元素,必不可少,动态内存分配,避免内存泄漏int*pa,*pb;pa=newint(5);pb=newint(10);pa=pb;,初值为5的空间无法再访问,动态内存分配注意事项,普通变量不能通过delete释放inta=5;int*pa=,通过编译,但出现运行错误,动态内存分配注意事项,不能对动态请求的内存连续使用delete释放2次;注意delete的本质voidfun()int*pa=newint(5);*pa=5;deletepa;coutpaendl;,动态内存分配注意事项,另外一种形式的内存泄漏voidfun()int*pa=newint(5);voidmain()fun();,X,fun返回后,pa被释放,5所占用的内存不可访问!,8、常指针和指向常量的指针,指向常量指针constchar*pc=“abcd”;或charconst*pc=“abcd”;pc所指向的字符串不能被修改。pc3=a;但pc可以指向别的字符串chars=“hello”;pc=s;,X,常指针和指向常量指针,常指针char*constpc=“abcd”;pc不能指向别的字符串,但可改变指针所指向的内容。pc2=a;chars=“hello”;pc=s;,X,常指针和指向常量指针,指向常量的常指针constchar*constpc=“abcd”;pc不能指向别的字符串,也不能改变指针所指向的内容。pc2=a;chars=“hello”;pc=s;,X,X,主要内容,1、函数的值传递,函数的参数是局部变量,栈中intsum(inta,intb)returna+b;voidmain()intx(5),y(4);coutsum(x,y)endl;,运行结果9,2、函数的指针传递,voidsum(int*a,intb)*a+=b;voidmain()intx(5),y(4);sum(,指针a指向x,运行结果9,函数的指针传递,voidxhg(int*a,int*b)int*tmp;tmp=b;b=a;a=tmp;voidmain()intx(5),y(4);xhg(,运行结果54,函数的指针传递,voidxhg(int*a,int*b)int*tmp;tmp=b;b=a;a=tmp;voidmain()intx(5),y(4);int*px=,运行结果54,3、引用的概念,引用是变量或对象的别名,建立引用时必须确定引用的对象,对引用的操作实际上就是对被引用者的操作。inti=1;int/以后对ri的操作,实际上操作的是i/可以认为ri和i在内存中占用相同的单元,函数的引用传递,引用只是别名,并不为其分配存储单元voidsum(int,a和x实质是同一个东西,4、函数返回指针,返回指向内存某处的指针char*elem(char*s,intn)return,需要定义一个指针变量接收返回值,运行结果C+PAogram,函数返回引用,返回对某个变量的引用char,无需定义一个变量接收返回值,运行结果C+PAogram,返回引用和指针的陷阱,不能返回指向局部变量的指针char*elem(char*s,intn)charc=sn;return,危险!c只是局部变量,返回引用和指针的陷阱,不能返回对局部变量的引用char,危险!C只是局部变量,假象,返回对某个变量的引用char,只是将ch的内容由r修改为A,运行结果C+Program,5、函数的递归调用,求阶乘longfact(intn)if(n=1)return1;returnn*fact(n-1);voidmain()inta=fact(4);coutaendl;,递归的终止条件,函数的递归调用,递归的过程,fact(4),4,n,4*fact(3),3*fact(2),2*fact(1),return1,1,2,6,6、函数参数的默认值,intsum(inta,intb=2,intc=3)returna+b+c;voidmain()coutfun(2)endl;coutfun(2,5)endl;coutfun(2,3,6)endl;,运行结果71011,从某个位置开始,全部指定默认参数,7、内联函数,内联函数的基本思想函数调用便于模块化设计,程序结构清晰但函数调用占用一定的系统资源:保护现场、参数入栈内联函数:将函数的编译后的模块直接嵌入调用处,避免函数调用的开销。适用于代码量少的函数,且不能为递归函数,内联函数,内联函数的示例inlineintadd(inta,intb)returna+b;voidmain()intx=add(2,4);coutxendl;,将编译好的add模块替换到此处,内联函数,避免使用#define定义宏#defineADD(x,y)(x)+(y)voidmain()intx=ADD(2,4);coutxendl;,在编译之前进行源代码替换,无类型检查,8、函数重载,重载的概念多个函数使用相同的函数名,但确保函数的参数类型或参数个数不同。不能仅仅凭函数的返回类型进行重载通过重载,可实现对不同类型参数进行调用的统一版本。,函数重载,重载的应用(重载)voidprint(char*str)coutstrendl;voidprint(intvalue)coutvalueendl;voidprint(floatvalue)coutvalueendl;voidprint(doublevalue)coutvalueendl;,函数重载,重载的应用(主函数)viodmain()print(“Hello”);print(4);print(4.5f);print(4.5);,运行结果Hello44.54.5,函数重载的问题,避免二义性问题intfun(inta,intb=0);intfun(intx);voidmain()fun(2);,无法确定调用那个版本,出现二义性。,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!