资源预览内容
第1页 / 共44页
第2页 / 共44页
第3页 / 共44页
第4页 / 共44页
第5页 / 共44页
第6页 / 共44页
第7页 / 共44页
第8页 / 共44页
第9页 / 共44页
第10页 / 共44页
亲,该文档总共44页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
计算机科学引论C/C+语言介绍语言介绍1C/C+的计算机特性描述功能n计算资源的抽象n计算机:图灵机计算存储函数内存2内存与变量n内存(memory):一大块内存单元n每个内存单元有一个地址(address)n每个内存单元还可以存储一个值(value)n值可以是任何类型(type)(整数、字符)n注意:内存单元的地址和其存储的值0000000100020003C00040005100“地址”是一个常量,与内存单元一一对应内存单元中的“值”随时可能变化3内存与变量n变量(variable)n地址不好记忆,给个名字n有不同类型,可能占据不同数量的内存单元n一个变量占据的内存单元总是连续的000000010002000300040005AB4内存与变量n变量名(variable name)n变量的名字n变量的地址(variable address)n给变量分配的内存单元中最小的地址n又叫做“首地址”n变量的类型n大多数程序语言中变量都是有类型的n非兼容类型间不能运算,如 float*stringn不同类型可能占用内存单元数不同n变量的大小(size)000000010002000300040005AB5内存与变量n变量与内存单元的关系n变量的值存储在连续的内存单元中n内存单元是无类型的n变量对CPU来说也是无类型的n变量的类型只对编译器有作用nCPU可以把某个单元的数据当作任何类型处理00000001000200036500040005int? char? unsigned?AB6内存与变量n类比n人:变量n房间:内存单元n姓名:变量名n通讯地址:变量的地址n职业:变量类型7内存与变量n类比n人可以住不同的房间n变量也可以被放在不同的内存单元n房间由领导分配,内存由编译器/汇编器分配n一旦分配好,(人/变量)就有了地址n人名一般是父母取的,不大变化n变量名由程序员给定,不变n程序中可用地址索引变量,但用名更普遍n几乎很少用地址来索引人,但并非没有8内存与变量n数组(array)n如果一大堆同类变量要一起使用?n定义一大堆不同名的变量?n太麻烦n现实中:相连的办公室分配给一个部门的员工n把这一片称作“XX单位”数组9内存与变量n数组nC/C+语法n定义 int mathOffice10; 名 元素个数n引用 mathOffice3 = 101; DeanOffice = mathOffice0;一个元素(element)下标(index)10内存与变量n数组n内存中的分布n连续的多个内存单元nC/C+中数组的特性n下标从0开始n数组名是首地址n第一个单元的地址n下标为0的单元n数组也是变量n复合变量n数组元素也是变量n简单或复合000000010002000300040005000600070008char array5;array0array1array2array3array411内存与变量n复合变量n由多个简单变量组合成的变量n数组是一类复合变量n自定义的复合变量1. 定义复合变量的类型class TEmployeepublic:int ID;char Name64;2. 定义复合变量TEmployee seiTeather; 类型 变量名不要忘了!12内存与变量n变量的作用域(life cycle)n变量不一定一直存在n类比:雇员只签几年的合同n变量存在,可被程序使用的范围叫做作用域void AllocateOffice(int employeeID)int RoomNo;RoomNo = getRoom(employeeID);这两个变量是同类的!13内存与变量n变量的作用域n变量定义以后是要占用内存单元的n类比:雇员要占办公室n雇员辞职以后 交回办公室n变量不再需要以后?n回收分配的内存单元n根据作用域分配和释放内存n作用域开始的时候分配n作用域结束的时候释放内存是宝贵的资源,不能浪费!14void AllocateOffice(int employeeID)int RoomNo;RoomNo = getRoom(employeeID);内存与变量n自动(auto)变量n编译器在需要的地方自动插入分配和释放相应内存单元的指令,无需程序员管理程序运行到这里才分配内存(理论上)程序运行到这里就释放内存(两个都释放)在调用该函数的一开始分配内存15内存与变量n自动变量n如果分配很大一块内存?void ShowPhoto(const char *FileName)char Photo16*1024*1024; Stack Overflow?16内存与变量n栈(stack)n管理函数调用和返回信息n管理自动变量n空间比较小n32位平台上,一般1MB左右n如果函数调用太多,或者自动变量太多?nStack Overflow: 栈溢出n类比:某部门招员工太多,办公室不够n解决:抢别的部门的办公室n程序中?17内存与变量n堆(heap)n现代计算机的内存空间是比较大的n32位平台:最多4GBn栈只占用很小一部分n1MBn别的空间哪去了?n堆:大部分空间在此n如何使用?18内存与变量n获得堆的内存n返回值:地址(?)n如何使用?n叫啥名?new char16*1024*1024;size19内存与变量n指针(pointer)n存储地址的变量char *photo = new char16*1024*1024;ffff0008ffff000cffff0010ffff00140023004栈堆002300020023000300230004photo20指针n指针存储的是地址n一种情况是从堆分配的内存n还有别的情况n指针和整数的区别:没有!n合法的指针:(char*)12345n指针的大小通常和整数的大小相同n32位平台,通常是32位,或4字节n与指针所指向的内容的大小无关21指针n指针是变量n指针的值可以被改变n变的是什么?00230040011004没变!char *photo=new char16*1024*1024;photo=new char16;也没变!变了!22指针n访问指针指向的内容n指针可以如数组名一样使用n堆中的内存块就是数组char *photo=new charsize;for(int i=0;isize;i+)photoi = 0;photoeyePos = faceColor = photofacePos;23指针n指针的作用域n如其它的变量void ShowPhoto(const char *FileName)char *photo=new charfileSize; 指针指向的内容呢?24指针n指针指向内容的作用域n由程序员控制n不再使用的时候,要释放void ShowPhoto(const char *FileName)char *photo=new charfileSize; delete photo;25指针n如果忘了释放?还在!0023004内存泄漏(memory leak)!26指针n如果尚未分配内存就访问其指向的内容?char *photo;photofacePos = clPink;00132357非法指针访问!别的变量27指针n如果访问的单元超出了分配的范围?char *name=new char5;name5 = 0;Name-1 = L;002300020023000300230004002300050023000600230007002300080023000900230004指针越界!28指针n如何防止这些错误n小心?n人总是有犯错误的时候!n开发工具?nBorland C+ Builder 6以上版本可查这些错误n运行缓慢,需要很长时间调试n良好的书写风格n可以避免一部分错误29指针n良好的书写风格n总是把指针初始化成空nNULLn空:通常定义为(void*)0n地址为0的内存单元一般被定义为不能被访问,如果有对这个单元的访问,则一定是错误n一般现代操作系统把前64KB地址都设为不能访问n可以通过调试检测非法指针访问错误n其它错误?char *photo = NULL;30指针n用C+类防止内存泄漏n构造函数:在定义变量的一开始被自动调用n析构函数:在变量被释放前被自动调用n均由编译器在适当的位置自动插入指令完成n不需要程序员管理n可以“忘掉”这些事情!n可以方便地管理内存分配与释放31指针class TCharArraypublic:char *img;int len;TCharArray()img = NULL;len = 0;要管理的内存分配的内存大小构造函数初始化为空状态32指针/接上页TCharArray()Close();void Close()if(img!=NULL)delete img;img = NULL;len = 0;析构函数调用内存释放函数(很重要!)内存释放函数测试是否已经分配如是,则释放,并恢复成空状态33指针/接上页void Alloc(int size)Close();img = new charsize;len = size;内存分配函数调用内存释放函数(很重要!)分配内存,设置成合法状态实现其它功能34指针n如何使用?n定义变量,分配内存n如何访问其指向的内容?nfaceColor = photo.imgfacePos;n书写很麻烦n希望: = photofacePos;TCharArray photo;photo.Alloc(fileSize);35指针n操作符重载n重新定义操作符的含义class TCharArraychar operator(int inx)return imginx;前面的内容重载下标操作符36指针n指针越界?n = photo-1;n = photofileSize;class TCharArraychar operator(int inx)return imginx;if ( (inx=len) )/出错处理37指针n什么样的出错处理比较合适?n不知道!(程序逻辑上已经不可恢复)n用assert#include class TCharArraychar operator(int inx)assert( (i=0) & (i=0) & (i=0) & (i=0) & (ilen) );return imginx;直接返回该变量的访问方法复制一份char tmp=imginx再返回41指针n多种数据类型,为每个类型写一个类?class TIntArrayclass TLongArrayclass TFloatArrayclass TDoubleArrayclass TCharArrayclass TShortArray42模板n模板:管你是什么类型templateclass TArray public:T *Data;void Alloc(int n) Close(); Data = new Tn;T &operator(int n) return Datan;TArray IntArray;TArray FloatArray;TArray SA;TArrayTArray AA;43资源泄漏n用类机制防止其它资源泄漏n与上面过程类似class TMyFilepublic:FILE *MyFile;44
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号