




已阅读5页,还剩45页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1基本类型11变量的分类以为划分依据,分为全局变量与局部变量。例外函数参数也是局部变量12变量的作用域作用域的最大单位是文件编译的最小单位是文件,作用域的最小单位是,全局变量的作用域的文件,局部变量的作用域是,变量的作用域,始于定义处,结束预作用域结束。相同的作用域内不可以有重名的变量。当局部变量发生重名的时候,局部会覆盖全局的变量,小范围与大范围的变量发生重名的时候,小范围会覆盖大范围的变量。13变量的生命周期局部变量的生命周期早所在的函数,全局变量的声明周期同MAIN。14修饰类型修饰类型影响了变量的生命周期和存储区域。141AUTO自动变量局部变量在缺省存储类型的情况下归为自动变量作用修饰局部变量存储区域栈生命周期同所在的函数或作用域特点如未初始化,初始值未知。大将军变量,随用随开,用完即消142REGISTER寄存器变量存放在CPU的寄存器中。对于循环次数较多的循环控制变量及循环体内反复使用的变量均可定义为寄存器变量。作用修饰局部变量影响了变量的存储区域存储区域寄存器生命周期同所在的函数或作用域,随用随开,用完即消。特点如未初始化,初始值未知。不可取地址,易被编绎器优化143STATIC静态变量在程序执行时存在,并且只要整个程序在运行,就可以继续访问该变量。作用修饰局部变量和全局变量存储区域数据区生命周期同MAIN特点只初始化一次,默认初始化为0,生命周期同MAIN影响了全局变量的作用域和局部变量生命周期。144EXTERN扩展类型扩展全局的作用域。同文件中,或不同文件中。作用修饰全局变量。存储区域数据区生命周期同MAIN特点因为是修饰的是全局变量,所以只扩展了其作用域(本文件内或跨文件)。15C中CONST的类型1CONST定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象DEFINE一样给出的是立即数,所以,CONST定义的常量在程序运行过程中只有一份拷贝,而DEFINE定义的常量在内存中有若干个拷贝。2提高了效率。编译器通常不为普通CONST常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。16总结变量类型修饰类型作用域生命周期进程空间无本文件或其他文件读写数据区RW全局STATIC本文件同MAIN读写数据区RWREGISTER定义变量所在的寄存器局部AUTO定义变量所在的同所在的函数栈STATIC定义变量所在的,但可被引用同MAIN读写数据区RW2进程空间与内存管理21程序和进程程序源代码经过编译器编译后生成的可执行文件,静态的概念进程可执行文件,运行后被加载在内存中运行,运行的过程,即为进程。以下是可执行文件加载到内存后的分布情况,动态的概念。22进程空间布局首先32为操作系统采用虚拟内存技术,将4G的虚拟地址空间划分为两个部分用户空间和内核空间。用户空间从0到0XBFFFFFFF,内核空间从3G到4G。用户进程不能访问内核。程序中访问的内存地址不再是实际的物理内存地址,而是一个虚拟地址,然后由操作系统将这个虚拟地址映射到适当的物理内存地址上。这样,只要操作系统处理好虚拟地址到物理内存地址的映射,就可以保证不同的程序最终访问的内存地址位于不同的区域,彼此没有重叠,就可以达到内存地址空间隔离的效果。进程空间分布如下图数据量分布进程空间注释COMMANDARGS命令行参数普通局部变量STACK栈DYNAMICLIB加载动态库区MALLOC动态申请空间HEAP堆UNINITBSS未初始数据段未初始化RW初始化数据段的读写段普通全局静态全局或局部初始化DATA常量INIT常量RO初始化数据段的只读段常量TEXT代码段注上面常量是包括初始化的RO只读段23内存管理231栈内存栈区(STACK)有编译器自动分配释放,存放函数的参数,局部变量等在WINDOWS中,栈是向低地址扩展的数据结构,是一块连续的内存区域。也就是栈顶的地址和栈的最大容量(WINDOWS是2M)是系统规定好的。如果申请的空间超过剩余栈空间,将提示OVERFLOW,因此从栈获得的空间较小。栈空间不能返回。232堆内存堆区(HEAP)一般由程序员分配和释放,否则就由OS回收。堆用于存放全局变量,静态变量,常量字符串和函数代码(函数体的二进制代码堆堆是向高地址扩展的数据结构,是不连续的内存区域。堆的大小受限于系统中有效的虚拟内存。由此可见堆的内存获得比较灵活,空间较大。另外对内存可以在函数中返回。堆内存的申请与释放MALLOCVOIDMALLOCSIZE_T,SIZE,MALLOC函数在堆中分配参数_SIZE指定大小的内存,单位字节,函数返回VOID指针。CALLOCVOIDCALLOCSIZE_TNMEMB,SIZE_TSIZE第一个参数是所需内存单元数量,第二个参数是每个内存单元的大小(单位字节),CALLOC自动将分配的内存置0REALLOCVOIDREALLOCVOIDPTR,SIZE_TSIZE第一个参数P为之前用MALLOC或者CALLOC分配的内存地址,_NEWSIZE为重新分配内存的大小,单位字节。成功返回新分配的堆内存地址,失败返回NULL如果参数P等于NULL,那么REALLOC与MALLOC功能一致REALLOC新分配的空间不会像CALLOC自动清空,而是像MALLOC一样需要手动清空FREEVOIDFREEVOIDPFREE负责在堆中释放MALLOC分配的内存。参数P为MALLOC返回的堆中的内存地址堆内存的常见错误释放以后继续使用是错误的通过函数返回堆里的内存常见错误栈上的空间不能返回,只读数据区数据不能修改。在返回值的时候要具体情况具体对待,要清楚返回的指针是在常量区还是在栈区等。并且如果指针作为参数的时候是传入本身还是能够修改值。1通过返回值返回2通过参数返回INTMAIN01VOIDPFUNC/定义一个函数指针,指向FUNC的地址INTP1INTP/把指向代码区的指针强转为INTP110/改变代码区的内容是非法的。RETURN0INTA1PRINTF“A1N“RETURN5INTA2PRINTF“A2N“RETURN6/函数返回一个指针/INTGET1/这个是个错误的模型INTA10RETURN/代码的问题时,返回一个栈变量的地址INTGET2/正确的模型STATICINTA10RETURN/因为A是一个静态变量,静态变量的地址在程序运行期间一直有效INTGET3/正确的模型RETURNCALLOC1,SIZEOFINT/返回了一个堆的地址CONSTCHARGET_STR1/错误的模型CHARS6“HELLO“/S在哪里在栈里RETURNS/返回一个栈的地址CONSTCHARGET_STR2/正确的模型RETURN“HELLO“/HELLO是一个常量,在常量区,常量区和静态区是一样的,唯一的区别是常量区是只读的CONSTCHARGET_STR3/正确的模型CONSTCHARS“HELLO“RETURNSCONSTCHARGET_STR4/正确的模型CHARPCALLOC10,1/堆空间STRCPYP,“HELLO“RETURNP/函数的参数是指针VOIDGET_STR5CHARP/正确的模型STRCPYP,“HELLO“VOIDGET_STR6CHARP/错误的模型PCALLOC10,1/这个地方是给P这个形参分配了内存,但并没有修改实参的值STRCPYP,“HELLO“/函数终止的时候,P已经消失了VOIDGET_STR7CHARP/合法的PCALLOC10,1STRCPYP,“HELLO“VOIDGET_STR8CHARP/错误的模型PCALLOC10,1STRCPYP,“HELLO“/P是一个二级指针,不能当字符串处理3结构体STRUCT是结构体的关键字31匿名结构体仅在本地使用,不能带来多余的类型名。但需要定义的时候同时定义变量。STRUCTCHARNAME30CHARSEXINTAGEFLOATHIGHSTU32有名结构体一处定义,可以多出使用。STRUCTSTUDENTCHARNAME30CHARSEXINTAGEFLOATHIGHSTUSTRUCTSTUDENTSTU233别名结构体更好使用的结构体TYPEDEFSTRUCTSTUDENTCHARNAME30CHARSEXINTAGEFLOATHIGHSTUDENTSTUDENTSTU,STU234结构体类型变量的初始化以及访问341初始化凡是构造类型,要么在定义的时候初始化,要么先定义再成员分别初始化。342访问方式访问访问方式有两种一类是成员运算符,一类是指向运算符。343赋值同类结构体间可以相互赋值。STRUCTARRAYINTVAL10INTMAINSTRUCTARRAYARRAY1,2,3,4,5,6STRUCTARRAYARRAY2ARRAYFORINTI0IPRAGMAPACK4STRUCTSTUCHARASHORTBINTCCHARDINTMAINPRINTF“DN“,SIZEOFSTRUCTSTURETURN04数组41一维数组411数组的本质是一种构造类型,内存是一段连续的存储区域。数组类型中包括起始地址,步长,寻址范围。决定了内存的访问方式。412初始化INTARRAY101,2,3/部分初始化INTARRAY210310INTARRAY1100/清零INTARRAY3101,2,3,4,5,6,7,8,9,0,1,2/越界不检413步长INTA100/INT10APRINTF“APN“,APRINTF“A1PN“,A1/移动4个字节PRINTF“PRINTF“/移动40个字节,注对于一维数组取地址,等价于数组指针而不是二级指针。INTA10INTP10414作为参数传递415返回堆里的数组通过返回值注这里要与DATA段的RO段分开,若为CHARP“DEWUFY“,则不能被返回通过函数参数注此题在定义数组时要将0的字节分配进去,循环移位时要循环本身的长度,否则会发生未知错误42二维数组421数组的本质是一个一维数组,只是数组成员,由基本数据类型变成了构造数据类型。TYPENAMEMNTYPENNAMEM422初始化行可以省,列不可以省部分初始化和清零任然可以用INTA23123423访问INTA34/INT4A3/INT43A1A为首数组的地址,A1跳跃44位2432应用一维数组二维访问传递二维数组的时候,作参数练习注此题要理解/若要与CHARPN相等价,则后者最后含有NULL。522用法传一级指针,改变指针指向的内容。传二级指针,改变一级指针指向的内容。53指针数组531本质CHARPARRAYN,PARRAY先与结合,CHAR修饰的数组的内容,即数组的每个元素指针数组的本质是数组,数组中的每一个成员是一个指针。取值和取址其实都是取址。532访问方式为二维数组的访问方式533二级指针访问指针数组二级指针与指针数组名等价的原因CHARP是二级指针,CHARARRAYNARRAYARRAY0本身是CHAR型访问方式指针方式指针访问方式,比数组访问方式少了一个维度的概念,所以,通过指针方式访问,要么知道维度,要么知道结束标志。在这里可以用二维数组的那套公式去做具体值的访问。534CONST与指针535常用指针数组INTMAININTARGC,CHARARGV或者INTMAININTARGC,CHARARGVINTMAINCHARARGV,CHARARGC,CHARENV注这里面有一个缺点就是,参数的指针移到了别的地方,需要指定另一个指针去操作,这样不会改变指针指向的地方CONSTCHARP34P不能修改值,而P本身可以改变INTCONSTP34P可以改变值,而P本身不能改变CONSTCHARCONSTP34都不能改变54返回堆上一维空间541一级指针作为返回值输出VOIDALLOCMEMINTBASE,INTCOUNTVOIDPMALLOCBASECOUNTRETURNPRETURNPINTMAINCHARPALLOCMEMSIZEOFCHAR,100STRCPYP,“CHINA“PRINTF“S“,PFREEPRETURN0542二级指针作为函数参数输出INTALLOCMEMVOIDP,INTBASE,INTNPMALLOCBASENIFPNULLRETURN1INTMAINCHARPNULLALLOCMEMSTRCPYP,“CHINA“PRINTF“S“,PFREEPRETURN055返回堆上二维空间二维空间,并不一定就是二维数组,具有数组的访问形式。但己经远远不是数组的定义了。551一级指针作返回值输出VOIDALLOC2DMEMINTBASE,INTROW,INTLINEVOIDPMALLOCBASEROWLINERETURNPINTMAININTP5ALLOC2DMEMSIZEOFINT,3,5FORINTI0IVOIDFUNCINTB100PRINTF“DN“,SIZEOFB/4INTMAINVOIDINTPNULLPRINTF“DN“,SIZEOFP/4PRINTF“DN“,SIZEOFP/4INTA100PRINTF“DN“,SIZEOFA/400PRINTF“DN“,SIZEOFA100/4PRINTF“DN“,SIZEOF/4INTB100FUNCBINTC23PRINTF“DN“,SIZEOFC/24PRINTF“DN“,SIZEOFC0/12/INT3C2INTD3PRINTF“DN“,SIZEOFD/4CHARQMALLOC100PRINTF“DN“,SIZEOFQ/4PRINTF“DN“,SIZEOF/4/WINDOWVSLINUXRETURN07链表71链表引入的意义链表是对内存中零碎空间的有效组织和使用。数组的特点存储内存中的一段连续的存储空间。2M10MMALLOC对数大空间,容易申请缺点时间复杂度为O1,插入和是删除,支持力度很差链表的特点内存中不连续的点空间,构成逻辑上的连续空间申请空间很长,是对零碎空间的有效组织。插入和删除是很方便的缺点时间复杂度为ON。72单向链表73双向循环链表731双向链表的节点TYPEDEFSTRUCTNODEINTDATASTRUCTNODEPRESTRUCTNODENEXTNODE;732双向链表的结构732双向链表的创建静态创建NODEANODEBNODECNODEDNODEHEADADATA0XFFFFF/设节点A为头节点,A是头节点没有内容BDATA1CDATA2DDATA3ANEXTBNEXTCNEXTDNEXTAPREDPRECPREBPRENODEPHEADHEADNEXTWHILEPHEADHEAD/只要不回到头结点就循环PRINTF“DN“,PHEADDATAPHEADPHEADNEXT动态创建1尾插法分析首先要循环,所以要定一个NODEPH,跟着一起移动,同时也防止HEAD的位置移动。不管单链表还是双向链表都需要。步骤NODEPHHEADCURPREPHPHNEXTCURPRECUR代码NODECREATELISTNODEHEADNODEMALLOCSIZEOFNODENODEPHHEADNODECURNULLPHNEXTNULL/将PH的前驱和后驱都置为空PHPRENULLINTDATASCANF“D”,WHILEDATACURNODEMALLOCSIZEOFNODECURDATADATAPHNEXTCURCURPREPHPHCURSCANF“D”,/完成回环,下面这两步很重要CURNEXTHEADHEADPRECURRETURNHEAD;2头插法分析首先要注意的是HEADNEXTHEADPREHEAD,为了保证循环第一次与后面的循环一样,插入时不能破坏别的节点。1,2步骤先连上一个新节点,3,4步骤破坏了原有的指向。步骤HEADNEXTHEADPREHEAD;/最后一个可以回环CURPREHEADCURNEXTHEADNEXT/HEAD指向自己的原因,因为第一个插入时要回环HEADNEXTCURCURNEXTPRECUR代码VOIDINSERT2DLIST/NODEHEADNODEMALLOCSIZEOFNODE传参数时候用/HEADNEXTHEADPREHEAD传参数时候用INTDATASCANF“D”,WHILEDATANODECURNODEMALLOCSIZEOFNODECURDATADATACURPREHEADCURNEXTHEADNEXTHEADNEXTCURCURNEXTPRECURSCANF“D”,733双向链表的遍历VOIDTRAVERSE2DLISTNODEHEADNODEPHHEADWHILEPHHEADPRINTF“PHPHNEXT734双向链表的求长度INTLENDLISTNODEHEADNODEPHHEADNEXTINTNUM0WHILEPHHEADNUMPHPHNEXTRETURNNUM735双向链表的查找单方向查找NODESEARCHLISTNODEHEAD,INTDATANODEPHEADHEADNEXTWHILEPHEADHEADIFPHEADDATADATARETURNPHEADRETURNNULL双方向查找分析链表节点个数分为偶数个和奇数个,从两个方向一起其查找。且这里用到的方法是,让这两个指针错过一个位置,之前一直循环,直到找到元素。两指针相等时,所以之前先判断与值比较。代码NODERESEARCH2DLISTNODEHEAD,INTDATANODEPBHEADNEXTNODEPEHEADPREWHILEPBPENEXTIFPBDATADATARETURNPBIFPEDATADATARETURNPEIFPBPERETURNNULLPBPBNEXTPEPEPRE736双向链表的删除特定元素分析要想删除得先查找到某个指定的元素,VOIDDELETE2DLISTNODEPFIND/这里是传入找到的节点PFINDPRENEXTPFINDNEXT/PFINDNEXTPREPFINDPRE/双向链表的删除操作比较简单,因为有指定的前驱和后驱FREEPFIND737双向链表的排序用冒泡法实现双向链表的排序VOIDSORTDLISTNODEHEAD,INTLENNODEP,QFORINTI0INEXTQPNEXTFORINTJ0JDATAQDATAPDATAQDATAQDATAPDATAPDATAQDATAPPNEXTQPNEXT用选择排序实现双向链表的排序VOIDSELECT2DLISTNODEHEAD,INTLENNODEPHEADNEXTNODEQPNEXTINTIINTJINTMIN0NODESMALLFORI0IDATASMALLPFORJI1JQDATASMALLQ/记住最小值的小标MINQDATA/记住最小值QQNEXT/内层循环Q要后移IFSMALLP/判断最小值还是不是原来第一个节点的值PDATASMALLDATASMALLDATAPDATAPDATASMALLDATAPPNEXT/P后移QPNEXT/将Q再次移到P的后面直接操作NEXT和PRE来实现排序因为大的数据,直接操作数据的话效率不高,指针只占四个字节所以直接用指针来做。分析首先用1,2步打断指向P的,然后3,4步插入到后边,5,6步完善结构。1,2可以互换顺序,3,4可以互换顺序,5,6可以互换顺序代码VOIDSORTPLISTNODEHEAD,INTLENNODEPNODEQFORINTI0INEXT/每次外部循环一次前要将其指向最开始QPNEXTFORINTJ0JDATAQDATAQPREPPREPPRENEXTQPPREQPNEXTQNEXTQNEXTPPNEXTPREPQPNEXT/满足条件的话,就将Q移动到P的后面,这个不周之前因为P,Q已经换了位置,为了下次循环,要修改ELSEPPNEXT/不满足条件循环一次后将P,Q后移QQNEXT738双向链表的销毁分析可以将最后一个节点的NEXT和PRE置为空,转化成单链表来操作。VOIDDESTROYDLISTNODEHEADHEADPRENEXTNULLNODEPHWHILEHEADNULLPHHEADHEADHEADNEXTFREEPH总结1、在操作链表不管单向还是双向时,进行操作时这样保证别的节点不成一个没有归宿的节点。2、操作链表时HEAD的开始状态要弄清楚,具体操作要具体置状态。8字符串81什么是字符串被引号引起的一串字符,就是字符串。比如“SSSS”,系统自动在后面加上了结束标记。C语言中没有定义字符串变量。它是以常量的形式存在,编译时处理成一个指向常量字符串的指针。CHARPNULL;P的值为空。CHARPP”P指向一个空串。82字符数组字符数组用于存放字符串,但有别于字符串。数组的大小字符串的长度等价数组的大小INCLUDEVOIDFOOVOIDCHARSTRING10,STR110INTIFORI0ISTR2时,返回值0。834STRCAT与STRNCAT字符串追加与字符串有限追加,STRCAT是更安全的追加,但是本质上安全还取决于用户输入参数。CHARSTRNCATCHARS1,CONSTCHARS2,SIZE_TN函数功能S2字符串中只有前N个字符被追加到S1字符串,复制过来的S2字符串的第一个字符覆盖了S1字符串结尾的空字符,即0字符。S2字符串中包括S2N在内的字符都不会被复制,并且追加一个空字符到所得结果后面,返回值是S1。835字符串分隔函数STRTOKCHARSTRTOKCHARS,CHARDELIM函数功能分解字符串为一组字符串,DELIM为要分隔的字符串,它会按照DELIM中每个字符去分解,而不是当成一起去分解。要注意的是当找不到这个中字符串的时候它会返回整个原S字符串而不是返回NULL,而且将DELIM所在的字符置为0。其次要注意的是循环的时候,第一次之后每次要将S设为NULL,这是要求。返回值返回被DELIM分隔开的字符串。INCLUDEINCLUDEINTMAINCHARA“AAAAAABBBBBBBBCCCCCDDDDDD“CHARPSTRTOKA,“WHILEPNULLPRINTF“SN“,PPSTRTOKNULL,“RETURN0836STRCHRCHARSTRCHRCHARSTR,INTCH函数功能返回字符串STR中首次出现字符C的位置指针,即CH以及之后的字符串,返不到返回NULL。INCLUDEINLCUDEINTMAINCHARSTR1“ABCD123456EFG“CHARCH“C“CHARPFSTRCHRSTR1,CHIFPFNULLPRINTF“SN“,PFELSEPRINTF“FINDNONEN“RETURN0837STRSTRCHARSTRSTRCHARSTR1,CONSTCHARSTR2函数功能STRSTR函数搜索字符串STR2在字符串STR1中是否出现。找到所搜索的字符串,则该函数返回第一次匹配的字符串的地址,即STR2以及之后的字符串;如果未找到所搜索的字符串,则返回NULL。INCLUDEINLCUDEINTMAINCHARSTR1“ABCD123456EFG“CHARSTR2“1234“CHARPFSTRSTRSTR1,STR2IFPFNULLPRINTF“SN“,PFELSEPRINTF“FINDNONEN“RETURN0统计一共出现的次数INCLUDEINLCUDEINTSTRCOUNTCHARSTR1,CHARSTR2INTCOUNT0WHILESTR1STRSTRSTR1,STR2NULLCOUNTSTR1STR1ST
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中国六角彩色铅笔市场调查研究报告
- 2025年中国人工智能家系统市场调查研究报告
- 2025年中国中型客车轮胎市场调查研究报告
- 2025年中国三爪式电动液压拉马市场调查研究报告
- 2025年中国PU皮革市场调查研究报告
- 2025年抗重症肌无力药项目合作计划书
- 《合同法》2025个易混淆知识点
- 驾照c考试试题及答案
- 2025租赁合同范本示范文
- 2025年原研药项目合作计划书
- 乡土中国的性别差异
- 高速铁路概论单元高速铁路发展概况课件
- 2024年甘肃兰州事业单位招聘考试真题答案解析
- 宁波浙大宁波理工学院招聘13名事业编制工作人员笔试历年参考题库附带答案详解
- 精神科医疗质量指标十二项控制评价体系
- 延安精神知识讲座课件
- 2025年广东省广州市越秀区委政法委员会招聘辅助人员4人历年高频重点提升(共500题)附带答案详解
- MOOC 颈肩腰腿痛中医防治-暨南大学 中国大学慕课答案
- 西安交通大学赵进全模拟电子技术基础第8-9章
- 画法几何与阴影透视复习题(DOC)
- 单片机端口扩展的方法
评论
0/150
提交评论