第2章 重要C语言概念.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文档。上传文档
查看更多
数据结构与算法实践教程 李文书 内容 第二章 重要C语言概念 Hot Tip 本章简要介绍算法描述和程序设计中要用到的一些C语言程序设计的重要知识。 重温内存分配、结构数组和结构指针的有关概念 理解动态内存分配的内涵和设计方法 2.1 内存分配 程序中使用数组的个数或占用内存单元的大小是在编写程序时就确定的。其特点是分配内存的大小无法在程序执行过程中改变。比如 int a=100; 此行代码指示编译器分配足够的存储区以存放一个整型值,该存储区与名字a相关联,并用数值100初始化该存储区。 2.1.2 动态内存分配 char *p1 = (char *)malloc(10*sizeof(int)); 此行代码分配了10个int类型的对象,然后返回对象在内存中的地址,接着这个地址被用来初始化指针对象p1,对于动态分配的内存唯一的访问方式是通过指针间接地访问,其释放方法为free(p1)。用于释放动态分配的内存空间p1。另外,在C语言中,还有calloc()和realloc()用于动态分配空间。它们之间的区别如下: malloc(n*sizeof(int)) :请求n个连续的、每个长度为整型的空间,若成功返回这些空间的首地址,失败返回0; calloc(n,sizeof(int)) :请求n个连续的、每个长度为整型的空间,若成功返回这些空间的首地址并将每个空间赋值为0,失败返回0; realloc(p,sizeof(int)*n):给一个已经分配了地址的指针重新分配空间,参数p为原有的空间地址,sizeof(int)*n是重新申请的地址长度,用于分配不足的时候 下面我们设计一个用动态数组保存字符串数据的示例。 2.1.3 C语言程序编译的内存分配 这是由编译器自动分配和释放的区域。主要存储函数的参数,函数的局部变量等。当一个函数开始执行时,该函数所需的实参、局部变量就推入栈中,该函数执行完毕后,之前进入栈中的参数和变量等也都出栈被释放掉。它的运行方式类似于数据结构中的栈(见第4章)。函数调用时会在栈上有一系列的保留现场及传递参数的操作。栈的空间大小有限定,VC的缺省是2M。栈不够用的情况一般是程序中分配了大量数组和递归函数层次太深。有一点必须知道,当一个函数调用完返回后它会释放该函数中所有的栈空间。 2. 堆(heap) 这是由程序员控制分配和释放的区域,在C语言中,用malloc()函数分配的空间就存在于堆上。在堆上分配的空间不像栈一样在某个函数执行完毕就自动释放,而是一直存在于整个程序的运行期间。当然,如果你不手动释放(free()函数)这些空间,在程序运行结束后系统也会将之自动释放。对于小程序来说可能感觉不到影响的存在,但对于大程序,例如一个大型游戏,就会遇到内存不够用的问题了。 堆是动态分配内存的,并且你可以分配使用很大的内存。但是用不好会产生内存泄漏。并且频繁地malloc()和free()会产生内存碎片(有点类似磁盘碎片),因为C分配动态内存时是寻找匹配的内存的。而用栈则不会产生碎片,在栈上存取数据比通过指针在堆上存取数据快些。一般大家说的堆栈和栈是一样的,就是栈(stack),而说堆时才是堆(heap)。栈是先入后出的,一般是由高地址向低地址生长。 例2.1 相关变量的赋值与堆栈、全局的关系 例2.2 参数与变量的生命周期 2.2结构数组和结构指针 2.2.2 结构指针 注意: 1. 结构作为一种数据类型, 因此定义的结构变量或结构指针变量同样有局部变量和全程变量,视定义的位置而定; 2. 结构变量名不是指向该结构的地址,这与数组名的含义不同, 因此若需要求结构中第一个成员的首地址应该是[结构变量名]。 2.2.3位结构 注意: 2.3 C语言常见问题分析 C程序中,指针和数组在不少地方可以相互替换着用,让人产生一种错觉,以为两者是等价的。数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在程序运行的过程中保持不变,只有数组的内容可以改变。指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。 2.3.2 分支语句 许多有关C语言的书中都说过,switch … case 的效率比if … else if 的效率高。其实这个结论并不完全正确,关键看实际代码,少数情况下,if…else if写法如果得当的话,它的效率是高于switch…case的。 2.3.3函数编写 参数的书写要完整,不要贪图省事只写参数的类型而省略参数名字。如果函数没有参数,则用void填充。 (2) 函数的返回值 C语言中,凡不加类

文档评论(0)

wxc6688 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档