C语言课程以外需补充的内容.docVIP

  1. 1、本文档共16页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
以下内容是课程中未涉及的部分,但在等级考试中经常出现的 关于有参宏的内容及其与函数的区别 (1) 宏定义和宏替换的定义 宏定义是将一个标识符(宏名)定义为某个字符串(宏体)。 宏定义有不带参数和带参数两种形式: #define 标识符 字符串 #define 标识符(参数表) 字符串 宏替换是用已定义的宏体(字符串)来替换宏名(标识符)。其形式: 宏名 宏名(参数表) 宏定义和宏替换两者的关系:必须先有宏定义,才能再有宏替换,后者是前者的逆操作。 例: #define A(x) x*x main() {int a=5; printf(“%d\n”,A(a-1)); } 程序经替换后的printf语句为: printf(“%d\n”,a-1*a-1);替换后再编译运行,程序的结果应为-1。 注意事项: ? 宏定义不是C语句,行末不能有分号。 ? 进行宏替换时,要记住只是简单的代换,不能随意增加或减少内容。 如上例,程序经替换后的printf语句不应该替换为: printf(?%d\n?,(a-1)*(a-1)); 如果需要上述的替换,则应将宏定义修改为: #define A(x) (x)*(x) ? 定义带参数的宏定义时,要特别注意括号的正确使用。 (2). 带参数的宏替换与函数调用的区别 实现的时间不同。宏替换的实现是在编译前完成;而函数调用是在运行时处理的。 实现的方法不同。宏替换只是简单的代换,即用已定义的宏体来替换宏名,它没有控制的转移。而函数调用是将实参传递给形参,然后转去执行调用的函数体,执行完后,返回到调用的地方继续往下执行。 宏定义不存在类型问题,即宏名和参数都是无类型的;而函数的形参和实参必须指出类型,且要求形参和实参的类型要相一致。 例: #define F1(x) x*x int f2(int x) { return x*x;} main() { int x=1; printf(F1(%d+1)=%d\n,x,F1(x+1)); printf(f2(%d+1)=%d\n,x,f2(x+1)); } 有关链表的操作 准备:动态内存分配 一、为什么用动态内存分配 但我们未学习链表的时候,如果要存储数量比较多的同类型或同结构的数据的时候,总是使用一个数组。比如说我们要存储一个班级学生的某科分数,总是定义一个float型(存在0.5分)数组: float score[30]; 但是,在使用数组的时候,总有一个问题困扰着我们:数组应该有多大? 在很多的情况下,你并不能确定要使用多大的数组,比如上例,你可能并不知道该班级的学生的人数,那么你就要把数组定义得足够大。这样,你的程序在运行时就申请了固定大小的你认为足够大的内存空间。即使你知道该班级的学生数,但是如果因为某种特殊原因人数有增加或者减少,你又必须重新去修改程序,扩大数组的存储范围。这种分配固定大小的内存分配方法称之为静态内存分配。但是这种内存分配的方法存在比较严重的缺陷,特别是处理某些问题时:在大多数情况下会浪费大量的内存空间,在少数情况下,当你定义的数组不够大时,可能引起下标越界错误,甚至导致严重后果。 那么有没有其它的方法来解决这样的外呢体呢?有,那就是动态内存分配。 所谓动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。从以上动、静态内存分配比较可以知道动态内存分配相对于景泰内存分配的特点: 1、不需要预先分配存储空间; 2、分配的空间可以根据程序的需要扩大或缩小。 二、如何实现动态内存分配及其管理 要实现根据程序的需要动态分配存储空间,就必须用到以下几个函数 1、malloc函数 malloc函数的原型为: void *malloc (unsigned int size) 其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。还有一点必须注意的是,当函数未能成功分配存储空间(如内存不足)就会返回一个NULL指针。所以在调用该函数时应该检测返回值是否为NULL并执行相应的操作。 下例是一个动态分配的程序: #include #include main() { int count,*array; /*count是一个计数器,array是一个整型指针,也可以理解为指向一个整型数组的首地址*/ if((array(int *) malloc(10*sizeof

文档评论(0)

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

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

1亿VIP精品文档

相关文档