ImageVerifierCode 换一换
格式:DOCX , 页数:51 ,大小:1,020.92KB ,
资源ID:23208818      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/23208818.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(传智播客C提高讲义扫地僧.docx)为本站会员(b****1)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

传智播客C提高讲义扫地僧.docx

1、传智播客C提高讲义扫地僧传智播客C提高讲义传智扫地僧 1程序内存模型1.1就业班引言1.1.1问题引出企业需要能干活的人 C学到什么程度可以找工作? 对于C/C+初级开发者,怎么达到企业的用人标准就业问题 问: 老师,有没有一个框框?有没有一个标准啊?我们学什么哪?C工程开发需要什么(培养什么能力) 成熟的、商业化的信息系统在分区、分层 信息系统的技术模型在分层 找出对我们初学者最近的那一层(哪些能力是你入行前,必须要掌握的)C项目开发的套路(一套接口) /socket_client pool api 设计与实现int sckClient_poolinit(void *handle);int

2、sckClient_getConnet(void *handle, void *hConnect);int sckClient_sendData(void *hConnect, unsigned char *data, int dataLen);int sckClient_getData(void *hConnect, unsigned char *data, int *dataLen);int sckClient_getData_Free(void *hConnect, unsigned char *data);int sckClient_putConnet(void *handle, vo

3、id *hConnect);int sckClient_pooldestory(void *handle);总结:寻找到学习的标准 培养两种能力接口的封装和设计(功能抽象和封装) 接口api的使用能力接口api的查找能力(快速上手)接口api的实现能力建立正确程序运行内存布局图(印象图)内存四区模型图 函数调用模型图 1.1.2总体课程安排课程大纲 C提高C+数据结构总体时间1个月实用专题总:轻松入门 实战应用形式1:专题的形式录制 话题集中 便于初学者学习形式2:知识点分段录制、细致讲解,从根本上提高初学者水平 项目开发中的重要点做剖析指针铁律1 2 3 4 5 6 7 8 9 10=企业用

4、人标准 1.1.3学员要求资料,时间空间管理工作经验,记录和积累临界点事物认知规律挑战 *p,*p, *p 提高课堂效率课堂例子,当堂运行。录制视频说明(不来,看视频)C/C+学习特点Java:学习、应用、做项目C:学习、理解、应用、做项目多动手不动手,永远学不会关键点、关键时候,进行强化训练和考试 1.1.4小结建立信心 接口的封装和设计指针教学,多年实践检验 心态放轻松了分析有效时间尊重事物认知规律、给自己一次机会1.2学员听课的标准C语言学到什么程度,就可以听懂传智播客就业班第一阶段的课程了。有没有一个标准? 选择法或者冒泡法排序在一个函数内排序通过函数调用的方式排序数组做函数参数的技术

5、盲点和推演 1.3内存四区专题讲座1.3.1数据类型本质分析数据类型概念“类型”是对数据的抽象 类型相同的数据有相同的表示形式、存储格式以及相关的操作 程序中使用的所有数据都必定属于某一种数据类型 数据类型的本质思考 思考数据类型和内存有关系吗? C/C+为什么会引入数据类型?数据类型的本质 数据类型可理解为创建变量的模具(模子);是固定内存大小的别名。数据类型的作用:编译器预算对象(变量)分配的内存空间大小程序举例,如何求数据类型的大小sizeof(int *) 请问:数据类型可以有别名吗?数据类型可以自定义吗?数据类型大小 int main()int a = 10;int b10 ;pri

6、ntf(int a:%d n, sizeof(a);printf(int a:%d n, sizeof(int *);printf(int b:%d n, sizeof(b);printf(int b:%d n, sizeof(b0);printf(int b:%d n, sizeof(*b);printf(hello.n);getchar();return 0; sizeof是操作符,不是函数;sizeof测量的实体大小为编译期间就已确定数据类型别名数据类型可以理解为固定大小内存块的别名,请问数据类型可以起别名吗?int main() /Teacher t1; printf(Teacher:

7、%d n, sizeof(Teacher); printf(u32:%d n, sizeof(u32); printf(u8:%d n, sizeof(u8); printf(hello.n); getchar(); return 0;数据类型的封装1、void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。2、用法1:数据类型的封装 int InitHardEnv(void *handle); 典型的如内存操作函数memcpy和memset的函数原型分别为 void * memcpy(void *dest, const void *src, siz

8、e_t len); void * memset ( void * buffer, int c, size_t num ); 3、用法2: void修饰函数返回值和参数,仅表示无。 如果函数没有返回值,那么应该将其声明为void型 如果函数没有参数,应该声明其参数为void int function(void) return 1;4、void指针的意义 C语言规定只有相同类型的指针才可以相互赋值 void*指针作为左值用于“接收”任意类型的指针 void*指针作为右值赋值给其它指针时需要强制类型转换 int *p1 = NULL; char *p2 = (char *)malloc(sizoeo

9、f(char)*20); 5、不存在void类型的变量 C语言没有定义void究竟是多大内存的别名6、扩展阅读void类型详解.doc数据类型总结与扩展1、数据类型本质是固定内存大小的别名;是个模具,c语言规定:通过数据类型定义变量。2、数据类型大小计算(sizeof)3、可以给已存在的数据类型起别名typedef4、数据类型封装概念(void 万能类型)思考1:C一维数组、二维数组有数据类型吗?int array10。 若有,数组类型又如何表达?又如定义?若没有,也请说明原因。抛砖:数组类型,压死初学者的三座大山1、数组类型2、数组指针3、数组类型和数组指针的关系思考2:C语言中,函数是可以

10、看做一种数据类型吗?a)若是,请说明原因并进一步思考:函数这种数据类型,能再重定义吗?b)若不是,也请说明原因。抛砖:1.3.2变量本质分析变量概念概念:既能读又能写的内存对象,称为变量;若一旦初始化后不能修改的对象则称为常量。 变量定义形式: 类型 标识符, 标识符, , 标识符 ; 例如:int x ; int wordCut , Radius , Height ; double FlightTime , Mileage , Speed ; 变量本质 1、程序通过变量来申请和命名内存空间 int a = 02、通过变量名访问内存空间(一段连续)内存空间的别名(是一个门牌号) 3、修改变量有

11、几种方法?1、直接2、间接。内存有地址编号,拿到地址编号也可以修改内存;于是横空出世了!(编程案例)3、内存空间可以再取给别名吗?4、数据类型和变量的关系 通过数据类型定义变量5、总结及思考题1 对内存,可读可写;2通过变量往内存读写数据;3 不是向变量读写数据,而是向变量所代表的内存空间中写数据。问:变量跑哪去了?思考1:变量三要素(名称、大小、作用域),变量的生命周期? 思考2:C+编译器是如何管理函数1,函数2变量之间的关系的?=引出两个重要话题:内存四区模型函数调用模型重要实验:int main333() / /2种方法,通过变量直接操作内存 / 通过内存编号操作内存 int i =

12、0; printf(&i:%dn, &i); *(int *)(1245024) = 10; printf(i:%d, i); printf(hello.n); getchar(); return 0;1.3.3程序的内存四区模型内存四区的建立流程流程说明1、操作系统把物理硬盘代码load到内存2、操作系统把c代码分成四个区3、操作系统找到main函数入口执行各区元素分析1.4函数调用模型1.4.1基本原理1.4.2内存四区模型和函数调用模型变量传递分析1、一个主程序有n函数组成,c+编译器会建立有几个堆区?有几个栈区?2、函数嵌套调用时,实参地址传给形参后,C+编译器如何管理变量的生命周期?

13、分析:函数A,调用函数B,通过参数传递的变量(内存空间能用吗?)1.4.3提示学好C语言的关键 1.4.4如何建立正确的程序运行内存布局图内存四区模型&函数调用模型函数内元素 深入理解数据类型和变量“内存”属性一级指针内存布局图(int *,char*)二级指针内存布局图(int * char *)函数间主调函数分配内存,还是被调用函数分配内存主调函数如何使用被调用函数分配的内存(技术关键点:指针做函数参数)=学习指针的技术路线图1.5内存四区强化训练01全局区训练char *p1= “abcdefg”;02 堆栈区生命周期训练Char p1= “abcdefg”;返回基本类型返回非基本类型0

14、3堆栈属性训练测试heap生长方向测试stack生长方向Heap、stack生长方向和内存存放方向是两个不同概念野指针Malloc得到指针释放问题测试free(p)free(p+1),深入理解 1.6作业强化训练1划出内存四区 void main26() char buf100; /byte b1 = new byte100; int a = 10; /分配4个字节的内存 栈区也叫临时区 int *p;/分配4个字节的内存 p = &a; /cpu执行的代码,放在代码区 *p = 20; / char *p = NULL; /分配4个字节的内存 栈区也叫临时区 p = (char *)mall

15、oc(100); /内存泄露概念 if (p != NULL) free(p); system(pause);全局区代码测试char * getstring1() char *p1 = abcde; return p1;char * getstring2() char *p2 = abcde; return p2;void main() int i= 0; /指针指向谁就把谁的地址赋给指针变量。 char *p1 = getstring1(); char *p2 = getstring2(); char * p3 = NULL; /p3 是个变量 /指针变量和它所执行的内存空间变量是两个不同的

16、概念 strcmp(p1, p2); system(pause);训练2 划出内存四区void main01() char buf100; /byte b1 = new byte100; int a = 10; /分配4个字节的内存 栈区也叫临时区 int *p;/分配4个字节的内存 p = &a; /cpu执行的代码,放在代码区 *p = 20; / char *p2 = NULL; /分配4个字节的内存 栈区也叫临时区 p2 = (char *)malloc(100); /内存泄露概念 if (p2 != NULL) free(p2); /p2 = NULL; 若不写,实验效果,分析原因

17、if (p2 != NULL) free(p2); system(pause);2指针知识体系搭建2.1前言 先从整体上把握指针的知识体系。然后突破1级指针、二级指针、多级指针。2.2指针强化铁律1:指针是一种数据类型 1)指针也是一种变量,占有内存空间,用来保存内存地址测试指针变量占有内存空间大小2)*p操作内存在指针声明时,*号表示所声明的变量为指针在指针使用时,*号表示 操作 指针所指向的内存空间中的值 *p相当于通过地址(p变量的值)找到一块内存;然后操作内存 *p放在等号的左边赋值(给内存赋值) *p放在等号的右边取值(从内存获取值)3)指针变量和它指向的内存块是两个不同的概念/含义

18、1 给p赋值p=0x1111; 只会改变指针变量值,不会改变所指的内容;p = p +1; /p+/含义2 给*p赋值*p=a; 不会改变指针变量的值,只会改变所指的内存块的值 /含义3 =左边*p 表示 给内存赋值, =右边*p 表示取值 含义不同切结!/含义4 =左边char *p /含义5 保证所指的内存块能修改4)指针是一种数据类型,是指它指向的内存空间的数据类型 含义1:指针步长(p+),根据所致内存空间的数据类型来确定p+=(unsigned char )p+sizeof(a);结论:指针的步长,根据所指内存空间类型来定。 注意: 建立指针指向谁,就把把谁的地址赋值给指针。图和代码

19、和二为一。 不断的给指针变量赋值,就是不断的改变指针变量(和所指向内存空间没有任何关系)。铁律2:间接赋值(*p)是指针存在的最大意义 1)两码事:指针变量和它指向的内存块变量2)条件反射:指针指向某个变量,就是把某个变量地址否给指针3)*p间接赋值成立条件:3个条件 a)2个变量(通常一个实参,一个形参)b) 建立关系,实参取地址赋给形参指针 c) *p形参去间接修改实参的值 Int iNum = 0; /实参int *p = NULL;p = &iNum;iNum = 1;*p =2 ; /通过*形参 = 间接地改变实参的值*p成立的三个条件:4)引申: 函数调用时,用n指针(形参)改变n

20、-1指针(实参)的值。/改变0级指针(int iNum = 1)的值有2种方式/改变1级指针(eg char *p = 0x1111 )的值,有2种方式/改变2级指针的(eg char *pp1 = 0x1111 )的值,有2种方式/函数调用时,形参传给实参,用实参取地址,传给形参,在被调用函数里面用*p,来改变实参,把运算结果传出来。/指针作为函数参数的精髓。铁律3:理解指针必须和内存四区概念相结合 1)主调函数 被调函数 a)主调函数可把堆区、栈区、全局数据内存地址传给被调用函数b)被调用函数只能返回堆区、全局数据2)内存分配方式a)指针做函数参数,是有输入和输出特性的。铁律4:应用指针必

21、须和函数调用相结合(指针做函数参数) 编号指针函数参数内存分配方式(级别+堆栈)主调函数实参被调函数形参备注011级指针(做输入)堆分配使用一般应用禁用栈分配使用常用Int showbuf(char *p); int showArray(int *array, int iNum)021级指针(做输出)栈使用结果传出常用int geLen(char *p, int *p);032级指针(做输入)堆分配使用一般应用禁用栈分配使用常用int main(int arc ,char *arg); 指针数组int shouMatrix(int 34, int iLine);二维字符串数组042级指针(做输

22、出)堆使用分配常用,但不建议用,转化成02int getData(char *data, int *dataLen);Int getData_Free(void *data);Int getData_Free(void *data); /避免野指针 053级指针(做输出)堆使用分配不常用int get(char *content, int *pLine); int get(char *content, int *pLine);指针做函数参数,问题的实质不是指针,而是看内存块,内存块是1维、2维。1)如果基础类int变量,不需要用指针;2)若内存块是1维、2维。铁律5:一级指针典型用法(指针做函

23、数参数)一级指针做输入int showbuf(char *p)int showArray(int *array, int iNum)一级指针做输出int geLen(char *p, int *p);理解主调函数还是被调用函数分配内存被调用函数是在heap/stack上分配内存铁律6:二级指针典型用法(指针做函数参数)二级指针做输入int main(int arc ,char *arg); 字符串数组int shouMatrix(int 34, int iLine);二级指针做输出int Demo64_GetTeacher(Teacher *ppTeacher);int Demo65_GetT

24、eacher_Free(Teacher *ppTeacher);int getData(char *data, int *dataLen);Int getData_Free(void *data);Int getData_Free2(void *data); /避免野指针理解主调函数还是被调用函数分配内存被调用函数是在heap/stack上分配内存铁律7: 三级指针输出典型用法三级指针做输出int get(char *content, int *pLine); int get(char *content, int *pLine);理解主调函数还是被调用函数分配内存被调用函数是在heap/sta

25、ck上分配内存铁律8:杂项,指针用法几点扩充1)野指针 2种free形式int getData(char *data, int *dataLen); int getData_Free(void *data);int getData_Free2(void *data);2)2次调用主调函数第一次调用被调用函数求长度;根据长度,分配内存,调用被调用函数。3)返回值char */int/char *4)C程序书写结构商业软件,每一个出错的地方都要有日志,日志级别铁律9:一般应用禁用malloc/new2.3接口封装设计思想引导 基于socketclient客户端接口设计与实现(仿真模拟)2.4附录【

26、王保明老师经典语录】1)指针也是一种数据类型,指针的数据类型是指它所指向内存空间的数据类型2)间接赋值*p是指针存在的最大意义3)理解指针必须和内存四区概念相结合4)应用指针必须和函数调用相结合(指针做函数参数)指针是子弹,函数是枪管;子弹只有沿着枪管发射才能显示它的威力;指针的学习重点不言而喻了吧。接口的封装和设计、模块的划分、解决实际应用问题;它是你的工具。5)指针指向谁就把谁的地址赋给指针6)指针指向谁就把谁的地址赋给指针,用它对付链表轻松加愉快7)链表入门的关键是分清楚链表操作和辅助指针变量之间的逻辑关系8)C/C+语言有它自己的学习特点;若java语言的学习特点是学习、应用、上项目;

27、那么C/C+语言的学习特点是:学习、理解、应用、上项目。多了一个步骤吧。9)学好指针才学会了C语言的半壁江山,另外半壁江山在哪里呢?你猜,精彩剖析在课堂。10) 理解指针关键在内存,没有内存哪来的内存首地址,没有内存首地址,哪来的指针啊。3字符串和一级指针内存模型专题3.1字符串基本操作字符数组初始化方法int main11() /1 大号法 初始化列表 /数组初始化有2种方法 默认元素个数、指定元素个数 char buf1 = a, b, c, d, e; /若没有指定长度,默认不分配零 /若指定长度,不够报错;buf长度多于初始化个数,会自动补充零 char buf26 = a, b, c

28、, d, e; char buf36 = a, b, c, d, e; /char buf45 = a, b, c, d, e; printf(buf3:%s, buf3); system(pause);在C语言中使用字符数组来模拟字符串C语言中的字符串是以0结束的字符数组C语言中的字符串可以分配于栈空间,堆空间或者只读存储区/在C语言中使用字符数组来模拟字符串/C语言中的字符串是以0结束的字符数组/C语言中的字符串可以分配于栈空间,堆空间或者只读存储区int main12() /1 用字符串来初始化数组 char buf2 = a, b,c,d,0; /2 字符串常量初始化一个字符数组 char buf3 = abcde; /结论:会补充零 char buf4 = abcde; char buf5100

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1