轻松入门实战应用传智播客C++学院就业班第一阶段C提高课程传智播客C提高讲义传智扫地僧1程序内存模型1.1就业班引言1.1.1问题引出企业需要能干活的人C学到什么程度可以找工作?对于C/C++初级开发者,怎么达到企业的用人标准就业问题问:老师,有没有一个框框?有没有一个标准啊?我们学什么哪?C工程开发需要什么(培养什么能力)成熟的、商业化的信息系统在分区、分层轻松入门实战应用传智播客C++学院就业班第一阶段C提高课程信息系统的技术模型在分层轻松入门实战应用传智播客C++学院就业班第一阶段C提高课程找出对我们初学者最近的那一层(哪些能力是你入行前,必须要掌握的)C项目开发的套路(一套接口)//socket_clientpoolapi设计与实现intsckClient_poolinit(void**handle);intsckClient_getConnet(void*handle,void**hConnect);intsckClient_sendData(void*hConnect,unsignedchar*data,intdataLen);intsckClient_getData(void*hConnect,unsignedchar**data,int*dataLen);intsckClient_getData_Free(void*hConnect,unsignedchar*data);intsckClient_putConnet(void*handle,void**hConnect);intsckClient_pooldestory(void**handle);总结:寻找到学习的标准培养两种能力接口的封装和设计(功能抽象和封装)接口api的使用能力接口api的查找能力(快速上手)轻松入门实战应用传智播客C++学院就业班第一阶段C提高课程接口api的实现能力建立正确程序运行内存布局图(印象图)内存四区模型图函数调用模型图1.1.2总体课程安排课程大纲C提高C++数据结构总体时间1个月实用专题总:轻松入门实战应用形式1:专题的形式录制话题集中便于初学者学习形式2:知识点分段录制、细致讲解,从根本上提高初学者水平项目开发中的重要点做剖析指针铁律12345678910===》企业用人标准1.1.3学员要求资料,时间空间管理工作经验,记录和积累临界点事物认知规律挑战*p,**p,***p提高课堂效率课堂例子,当堂运行。录制视频说明(不来,看视频)轻松入门实战应用传智播客C++学院就业班第一阶段C提高课程C/C++学习特点Java:学习、应用、做项目C:学习、理解、应用、做项目多动手不动手,永远学不会关键点、关键时候,进行强化训练和考试1.1.4小结建立信心接口的封装和设计指针教学,多年实践检验心态放轻松了分析有效时间尊重事物认知规律、给自己一次机会1.2学员听课的标准C语言学到什么程度,就可以听懂传智播客就业班第一阶段的课程了。有没有一个标准?选择法或者冒泡法排序在一个函数内排序通过函数调用的方式排序数组做函数参数的技术盲点和推演轻松入门实战应用传智播客C++学院就业班第一阶段C提高课程1.3内存四区专题讲座1.3.1数据类型本质分析数据类型概念“类型”是对数据的抽象类型相同的数据有相同的表示形式、存储格式以及相关的操作程序中使用的所有数据都必定属于某一种数据类型数据类型的本质思考思考数据类型和内存有关系吗?C/C++为什么会引入数据类型?数据类型的本质数据类型可理解为创建变量的模具(模子);是固定内存大小的别名。数据类型的作用:编译器预算对象(变量)分配的内存空间大小程序举例,如何求数据类型的大小sizeof(int*)请问:数据类型可以有别名吗?数据类型可以自定义吗?轻松入门实战应用传智播客C++学院就业班第一阶段C提高课程数据类型大小intmain(){inta=10;intb[10];printf(inta:%d\n,sizeof(a));printf(inta:%d\n,sizeof(int*));printf(intb:%d\n,sizeof(b));printf(intb:%d\n,sizeof(b[0]));printf(intb:%d\n,sizeof(*b));printf(hello.....\n);getchar();return0;}sizeof是操作符,不是函数;sizeof测量的实体大小为编译期间就已确定数据类型别名数据类型可以理解为固定大小内存块的别名,请问数据类型可以起别名吗?intmain(){//Teachert1;printf(Teacher:%d\n,sizeof(Teacher));printf(u32:%d\n,sizeof(u32));printf(u8:%d\n,sizeof(u8));printf(hello.....\n);getchar();return0;}数据类型的封装1、void的字面意思是“无类型”,void*则为“无类型指针”,void*可以指向任何类型的数据。2、用法1:数据类型的封装intInitHardEnv(void**handle);典型的如内存操作函数memcpy和memset的函数原型分别为轻松入门实战应用传智播客C++学院就业班第一阶段C提高课程void*memcpy(void*dest,constvoid*src,size_tlen);void*memset(void*buffer,intc,size_tnum);3、用法2:void修饰函数返回值和参数,仅表示无。如果函数没有返回值,那么应该将其声明为void型如果函数没有参数,应该声明其参数为voidintfunction(void){return1;}4、void指针的意义C语言规定只有相同类型的指针才可以相互赋值void*指针作为左值用于“接收”任意类型的指针void*指针作为右值赋值给其它指针时需要强制类型转换int*p1=NULL;char*p2=(char*)malloc(sizoeof(char)*20);5、不存在void类型的变量C语言没有定义void究竟是多大内存的别名6、扩展阅读《void类型详解.doc》数据类型总结与扩展1、数据类型本质是固定内存大小的别名;是个模具,c语言规定:通过数据类型定义变量。2、数据类型大小计算(sizeof)3、可以给已存在的数据类型起别名typedef4、数据类型封装概念(void万能类型)思考1:C一维数组、二维数组有数据类型吗?intarray[10]。若有,数组类型又如何表达?又如定义?若没有,也请说明原因。抛砖:数组类型,压死初学者的三座大山轻松入门实战应用传智播客C++学院就业班第一阶段C提高课程1、数组类型2、数组指针3、数组类型和数组指针的关系思考2:C语言中,函数是可以看做一种数据类型吗?a)若是,请说明原因并进一步思考:函数这种数据类型,能再重定义吗?b)若不是,也请说明原因。抛砖:1.3.2变量本质分析变量概念概念:既能读又能写的内存对象,称为变量;若一旦初始化后不能修改的对象则称为常量。变量定义形式:类型标识符,标识符,…,标识符;例如:intx;intwordCut,Radius,Height;doubleFlightTime,Mileage,Speed;轻松入门实战应用传智播客C++学院就业班第一阶段C提高课程变量本质1、程序通过变量来申请和命名内存空间inta=02、通过变量名访问内存空间(一段连续)内存空间的别名(是一个门牌号)3、修改变量有几种方法?1、直接2、间接。内存有地址编号,拿到地址编号也可以修改内存;于是横空出世了!(编程案例)3、内存空间可以再取给别名吗?4、数据类型和变量的关系通过数据类型定义变量5、总结及思考题1对内存,可读可写;2通过变量往内存读写数据;3不是向变量读写数据,而是向变量所代表的内存空间中写数据。问:变量跑哪去了?思考1:变量三要素(名称、大小、作用域),变量的生命周期?思考2:C++编译器是如何管理函数1,函数2变量之间的关系的?====》引出两个重要话题:内存四区模型函数调用模型重要实验:intmain333(){////2种方法,通过变量直接操作内存//通过内存编号操作内存inti=0;printf(&i:%d\n,&i);*((int*)(1245024))=10;printf(i:%d,i);轻松入门实战应用传智播客C++学院就业班第一阶段C提高课程printf(hello....\n);getchar();return0;}1.3.3程序的内存四区模型内存四区的建立流程流程说明1、操作系统把物理硬盘代码load到内存2、操作系统把c代码分成四个区3、操作系统找到main函数入口执行轻松入门实战应用传智播客C++学院就业班第一阶段C提高课程各区元素分析1.4函数调用模型1.4.1基本原理轻松入门实战应用传智播客C++学院就业班第一阶段C提高课程1.4.2内存四区模型和函数调用模型变量传递分析1、一个主程序有n函数组成,c++编译器会建立有几个堆区?有几个栈区?2、函数嵌套调用时,实参地址传给形参后,C++编译器如何管理变量的生命周期?分析:函数A,调用函数B,通过参数传递的变量(内存空间能用吗?)轻松入门实战应用传智播客C++学院就业班第一阶段C提高课程1.4.3提示学好C语言的关键1.4.4如何建立正确的程序运行内存布局图内存四区模型&函数调用模型函数内元素深入理解数据类型和变量“内存”属性一级指针内存布局图(int*,char*)二级指针内存布局图(int**char**)函数间主调函数分配内存,还是被调用函数分配内存主调函数如何使用被调用函数分配的内存(技术关键点:指针做函数参数)======》学习指针的技术路线图1.5内存四区强化训练01全局区训练char*p1=“abcdefg”;02堆栈区生命周期训练Charp1[]=“abcdefg”;返回基本类型轻松入门实战应用传智播客C++学院就业班第一阶段C提高课程返回非基本类型03堆栈属性训练测试heap生长方向测试stack生长方向Heap、stack生长方向和内存存放方向是两个不同概念野指针Malloc得到指针释放问题测试free(p)free(p+1),深入理解1.6作业强化训练1划出内存四区voidmain26(){charbuf[100];//byteb1=newbyte[100];轻松入门实战应用传智播客C++学院就业班第一阶段C提高课程inta=10;//分配4个字节的内存栈区也叫临时区int*p;//分配4个字节的内存p=&a;//cpu执行的代码,放在代码区*p=20;//{char*p=NULL;//分配4个字节的内存栈区也叫临时区p=(char*)malloc(100);//内存泄露概念if(p!=NULL){free(p);}}system(pause);}全局区代码测试char*getstring1(){char*p1=abcde;returnp1;}char*getstring2(){char*p2=abcde;returnp2;轻松入门实战应用传智播客C++学院就业班第一阶段C提高课程}voidmain(){inti=0;//指针指向谁就把谁的地址赋给指针变量。char*p1=getstring1();char*p2=getstring2();char*******p3=NULL;//p3是个变量//指针变量和它所执行的内存空间变量是两个不同的概念strcmp(p1,p2);system(pause);}训练2划出内存四区voidmain01(){charbuf[100];//byteb1=newbyte[100];inta=10;//分配4个字节的内存栈区也叫临时区int*p;//分配