第八篇 指针.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
* 例如,下面的代码对数组求和,企图以数组名的增量来实现: int iArray[100]; int sum=0; //... for{int i=0;i100;i++} { sum+=iArray; iArray++; //error:数组名不是左值 } 对于编译器来说,数组名表示内存中分配了数组的固定位置,修改了这个数组名,就会丢失数组空间,所以数组名所代表的地址不能被修改 * 指针概念 指针运算 指针与数组 堆内存分配 指针与常量 指针与函数 字符指针 指针数组 命令行参数 函数指针 * 四. 堆内存分配 堆:堆(heap)是内存空间。堆是区别于栈区、全局数据区和代码区的另一个内存区域。堆允许程序在运行时(而不是在编译时),申请某个大小的内存空间 在通常情况,一旦定义了一个数组,那么不管这个数组是局部的(在栈中分配)还是全局 的(在全局数据区分配),它的大小在程序编译时即是已知的,因为必须用一个常数对数组的 大小进行声明: int i=10; //.... int a[i]; //error:定义时不允许数组元素个数为变量 int b[20]; //ok 但是,在编写程序时不是总能知道数组应该定义成多大,如果定义数组元素多了就浪费 内存了,更何况有时候根本不知道需要使用多少个数组元素。因此,需要在程序运行时从系 统中获取内存: 程序在编译和连接时不予确定这种在运行中获取的内存空间,这种内存环境随着程序 运行的进展而时大时小,这种内存就是堆内存,所以堆内存是动态的。堆内存也称动态内 存。 * 动态存储分配函数: void *malloc( size ); 参数size:欲分配的字节数 返回值: 成功,则返回void*型指针。 失败,则返回空指针。 该函数从堆内存中“切下”一块size大小的内存,将指向该内存的地址返回。该内存中的内容是未知的 头文件: stdlib.h 和 malloc.h * 动态内存释放函数 void free( void *memblock ); 参数memblock: 指针,指向需释放的内存。 返回值:无 free()参数是先前调用malloc()函数时返回的地址 头文件:stdlib.h 和 malloc.h * 实例:从内存中申请一个整数数组,并释放之。 #include iostream.h #include malloc.h void main(){ int arraySize; int *array; cout“please the length of array:\n” cin arraySize; array=(int *)malloc(arraySize*sizeof(int)); //堆内存分配 If(!array){ cout“no more memory allocated!”; exit(1); } for(int count=0;countarraySize;count++) array[count]=count*2; for(int count=0;countarraySize;count++) coutsetw(5)array[count]; free(array);//释放堆内存 } * 程序分析: 程序编译和连接时,在栈中分配了arraysize整型变量和array整型指针变量空间:程序运行中,调用函数malloc()并以键盘输入的整数值作为参数。malloc()函数在堆中寻找未被使用的内存,找够所需的字节数后返回该内存的起始地址。因为malloc()函数并不知道用这些内存干什么,所以它返回一个没有类型的指针。但对整数指针array来说, malloc()函数的返回值必须显式转换成整数类型指针才能被接受(ANSIC++标准) * 一个拥有内存的指针完全可以被看作为一个数组,而且位于堆中的数组和位于栈中的 数组结构是一样的。表达式“array[count]=count*2;”正是这样应用的。 上例中并没有保证一定可以从堆中获得所需内存。有时,系统能提供的堆空间不够分 配,这时系统会返回一个空指针值NULL。这时所有对该指针的访问都是破坏性的,因此调 用malloc()函数更完善的代码应该如下: if((array=(int *)malloc(arraysize*sizeof(int)==NULL) {

文档评论(0)

187****5045 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档