传智播客C提高讲义扫地僧Word下载.docx
- 文档编号:395722
- 上传时间:2023-04-28
- 格式:DOCX
- 页数:99
- 大小:1.47MB
传智播客C提高讲义扫地僧Word下载.docx
《传智播客C提高讲义扫地僧Word下载.docx》由会员分享,可在线阅读,更多相关《传智播客C提高讲义扫地僧Word下载.docx(99页珍藏版)》请在冰点文库上搜索。
指针铁律12345678910===》企业用人标准
1.1.3学员要求
资料,时间空间管理
工作经验,记录和积累
临界点
事物认知规律
挑战*p,**p,***p
提高课堂效率
课堂例子,当堂运行。
录制视频说明(不来,看视频)
C/C++学习特点
Java:
学习、应用、做项目
C:
学习、理解、应用、做项目
多动手
不动手,永远学不会
关键点、关键时候,进行强化训练和考试
1.1.4小结
建立信心
接口的封装和设计
指针教学,多年实践检验
心态放轻松了
分析有效时间
尊重事物认知规律、给自己一次机会
1.2学员听课的标准
C语言学到什么程度,就可以听懂传智播客就业班第一阶段的课程了。
有没有一个标准?
选择法或者冒泡法排序
在一个函数内排序
通过函数调用的方式排序
数组做函数参数的技术盲点和推演
1.3内存四区专题讲座
1.3.1数据类型本质分析
数据类型概念
“类型”是对数据的抽象
类型相同的数据有相同的表示形式、存储格式以及相关的操作
程序中使用的所有数据都必定属于某一种数据类型
数据类型的本质思考
思考数据类型和内存有关系吗?
C/C++为什么会引入数据类型?
数据类型的本质
数据类型可理解为创建变量的模具(模子);
是固定内存大小的别名。
数据类型的作用:
编译器预算对象(变量)分配的内存空间大小
程序举例,如何求数据类型的大小sizeof(int*)
请问:
数据类型可以有别名吗?
数据类型可以自定义吗?
数据类型大小
intmain()
{
inta=10;
intb[10];
printf("
inta:
%d\n"
sizeof(a));
sizeof(int*));
intb:
sizeof(b));
sizeof(b[0]));
sizeof(*b));
hello.....\n"
);
getchar();
return0;
}
sizeof是操作符,不是函数;
sizeof测量的实体大小为编译期间就已确定
数据类型别名
数据类型可以理解为固定大小内存块的别名,请问数据类型可以起别名吗?
//Teachert1;
printf("
Teacher:
sizeof(Teacher));
u32:
sizeof(u32));
u8:
sizeof(u8));
getchar();
return0;
}
数据类型的封装
1、void的字面意思是“无类型”,void*则为“无类型指针”,void*可以指向任何类型的数据。
2、用法1:
intInitHardEnv(void**handle);
典型的如内存操作函数memcpy和memset的函数原型分别为
void*memcpy(void*dest,constvoid*src,size_tlen);
void*memset(void*buffer,intc,size_tnum);
3、用法2:
void修饰函数返回值和参数,仅表示无。
如果函数没有返回值,那么应该将其声明为void型
如果函数没有参数,应该声明其参数为void
intfunction(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、可以给已存在的数据类型起别名typedef
4、数据类型封装概念(void万能类型)
思考1:
C一维数组、二维数组有数据类型吗?
intarray[10]。
若有,数组类型又如何表达?
又如定义?
若没有,也请说明原因。
抛砖:
数组类型,压死初学者的三座大山
1、数组类型
2、数组指针
3、数组类型和数组指针的关系
思考2:
C语言中,函数是可以看做一种数据类型吗?
a)若是,请说明原因
并进一步思考:
函数这种数据类型,能再重定义吗?
b)若不是,也请说明原因。
1.3.2变量本质分析
变量概念
概念:
既能读又能写的内存对象,称为变量;
若一旦初始化后不能修改的对象则称为常量。
变量定义形式:
类型标识符,标识符,…,标识符;
例如:
intx;
intwordCut,Radius,Height;
doubleFlightTime,Mileage,Speed;
变量本质
1、程序通过变量来申请和命名内存空间inta=0
2、通过变量名访问内存空间
(一段连续)内存空间的别名(是一个门牌号)
3、修改变量有几种方法?
1、直接
2、间接。
内存有地址编号,拿到地址编号也可以修改内存;
于是横空出世了!
(编程案例)
3、内存空间可以再取给别名吗?
4、数据类型和变量的关系
通过数据类型定义变量
5、总结及思考题
1对内存,可读可写;
2通过变量往内存读写数据;
3不是向变量读写数据,而是向变量所代表的内存空间中写数据。
变量跑哪去了?
变量三要素(名称、大小、作用域),变量的生命周期?
C++编译器是如何管理函数1,函数2变量之间的关系的?
====》引出两个重要话题:
内存四区模型
函数调用模型
重要实验:
intmain333()
//
//2种方法,通过变量直接操作内存
//通过内存编号操作内存
inti=0;
&
i:
%d\n"
&
i);
*((int*)(1245024))=10;
%d"
i);
hello....\n"
1.3.3程序的内存四区模型
内存四区的建立流程
流程说明
1、操作系统把物理硬盘代码load到内存
2、操作系统把c代码分成四个区
3、操作系统找到main函数入口执行
各区元素分析
1.4函数调用模型
1.4.1基本原理
1.4.2内存四区模型和函数调用模型变量传递分析
1、一个主程序有n函数组成,c++编译器会建立有几个堆区?
有几个栈区?
2、函数嵌套调用时,实参地址传给形参后,C++编译器如何管理变量的生命周期?
分析:
函数A,调用函数B,通过参数传递的变量(内存空间能用吗?
)
1.4.3提示学好C语言的关键
1.4.4如何建立正确的程序运行内存布局图
内存四区模型&
函数内元素
深入理解数据类型和变量“内存”属性
一级指针内存布局图(int*,char*)
二级指针内存布局图(int**char**)
函数间
主调函数分配内存,还是被调用函数分配内存
主调函数如何使用被调用函数分配的内存(技术关键点:
指针做函数参数)
======》学习指针的技术路线图
1.5内存四区强化训练
01全局区训练
char*p1=“abcdefg”;
02堆栈区生命周期训练
Charp1[]=“abcdefg”;
返回基本类型
返回非基本类型
03堆栈属性训练
测试heap生长方向
测试stack生长方向
Heap、stack生长方向和内存存放方向是两个不同概念
野指针
Malloc得到指针释放问题测试
free(p)
free(p+1),深入理解
1.6作业强化
训练1划出内存四区
voidmain26()
charbuf[100];
//byteb1=newbyte[100];
inta=10;
//分配4个字节的内存栈区也叫临时区
int*p;
//分配4个字节的内存
p=&
a;
//cpu执行的代码,放在代码区
*p=20;
{
char*p=NULL;
p=(char*)malloc(100);
//内存泄露概念
if(p!
=NULL)
{
free(p);
}
}
system("
pause"
全局区代码测试
char*getstring1()
char*p1="
abcde"
;
returnp1;
char*getstring2()
char*p2="
returnp2;
voidmain()
inti=0;
//指针指向谁就把谁的地址赋给指针变量。
char*p1=getstring1();
char*p2=getstring2();
char*******p3=NULL;
//p3是个变量
//指针变量和它所执行的内存空间变量是两个不同的概念
strcmp(p1,p2);
训练2划出内存四区
voidmain01()
char*p2=NULL;
p2=(char*)malloc(100);
if(p2!
free(p2);
//p2=NULL;
若不写,实验效果,分析原因
2指针知识体系搭建
2.1前言
先从整体上把握指针的知识体系。
然后突破1级指针、二级指针、多级指针。
2.2指针强化
铁律1:
指针是一种数据类型
1)指针也是一种变量,占有内存空间,用来保存内存地址
测试指针变量占有内存空间大小
2)*p操作内存
在指针声明时,*号表示所声明的变量为指针
在指针使用时,*号表示操作指针所指向的内存空间中的值
*p相当于通过地址(p变量的值)找到一块内存;
然后操作内存
*p放在等号的左边赋值(给内存赋值)
*p放在等号的右边取值(从内存获取值)
3)指针变量和它指向的内存块是两个不同的概念
//含义1给p赋值p=0x1111;
只会改变指针变量值,不会改变所指的内容;
p=p+1;
//p++
//含义2给*p赋值*p='
a'
不会改变指针变量的值,只会改变所指的内存块的值
//含义3=左边*p表示给内存赋值,=右边*p表示取值含义不同切结!
//含义4=左边char*p
//含义5保证所指的内存块能修改
4)指针是一种数据类型,是指它指向的内存空间的数据类型
含义1:
指针步长(p++),根据所致内存空间的数据类型来确定
p++=(unsignedchar)p+sizeof(a);
结论:
指针的步长,根据所指内存空间类型来定。
注意:
建立指针指向谁,就把把谁的地址赋值给指针。
图和代码和二为一。
不断的给指针变量赋值,就是不断的改变指针变量(和所指向内存空间没有任何关系)。
铁律2:
间接赋值(*p)是指针存在的最大意义
1)两码事:
指针变量和它指向的内存块变量
2)条件反射:
指针指向某个变量,就是把某个变量地址否给指针
3)*p间接赋值成立条件:
3个条件
a)2个变量(通常一个实参,一个形参)
b)建立关系,实参取地址赋给形参指针
c)*p形参去间接修改实参的值
IntiNum=0;
//实参
int*p=NULL;
p=&
iNum;
iNum=1;
*p=2;
//通过*形参==间接地改变实参的值
*p成立的三个条件:
4)引申:
函数调用时,用n指针(形参)改变n-1指针(实参)的值。
//改变0级指针(intiNum=1)的值有2种方式
//改变1级指针(egchar*p=0x1111)的值,有2种方式
//改变2级指针的(egchar**pp1=0x1111)的值,有2种方式
//函数调用时,形参传给实参,用实参取地址,传给形参,在被调用函数里面用*p,来改变实参,把运算结果传出来。
//指针作为函数参数的精髓。
铁律3:
理解指针必须和内存四区概念相结合
1)主调函数被调函数
a)主调函数可把堆区、栈区、全局数据内存地址传给被调用函数
b)被调用函数只能返回堆区、全局数据
2)内存分配方式
a)指针做函数参数,是有输入和输出特性的。
铁律4:
应用指针必须和函数调用相结合(指针做函数参数)
编号
指针函数参数
内存分配方式(级别+堆栈)
主调函数
实参
被调函数
形参
备注
01
1级指针
(做输入)
堆
分配
使用
一般应用禁用
栈
常用
Intshowbuf(char*p);
intshowArray(int*array,intiNum)
02
(做输出)
结果传出
intgeLen(char*pFileName,int*pfileLen);
03
2级指针
intmain(intarc,char*arg[]);
指针数组
intshouMatrix(int[3][4],intiLine);
二维字符串数组
04
常用,但不建议用,转化成02
intgetData(char**data,int*dataLen);
IntgetData_Free(void*data);
IntgetData_Free(void**data);
//避免野指针
05
3级指针
不常用
intgetFileAllLine(char***content,int*pLine);
intgetFileAllLine_Free(char***content,int*pLine);
指针做函数参数,问题的实质不是指针,而是看内存块,内存块是1维、2维。
1)如果基础类int变量,不需要用指针;
2)若内存块是1维、2维。
铁律5:
一级指针典型用法(指针做函数参数)
一级指针做输入
intshowbuf(char*p)
一级指针做输出
理解
主调函数还是被调用函数分配内存
被调用函数是在heap/stack上分配内存
铁律6:
二级指针典型用法(指针做函数参数)
二级指针做输入
字符串数组
二级指针做输出
intDemo64_GetTeacher(Teacher**ppTeacher);
intDemo65_GetTeacher_Free(Teacher**ppTeacher);
IntgetData_Free2(void**data);
//避免野指针
铁律7:
三级指针输出典型用法
三级指针做输出
铁律8:
杂项,指针用法几点扩充
1)野指针2种free形式
intgetData_Free(void*data);
intgetData_Free2(void**data);
2)2次调用
主调函数第一次调用被调用函数求长度;
根据长度,分配内存,调用被调用函数。
3)返回值char*/int/char**
4)C程序书写结构
商业软件,每一个出错的地方都要有日志,日志级别
铁律9:
一般应用禁用malloc/new
2.3接口封装设计思想引导
基于socketclient客户端接口设计与实现(仿真模拟)
2.4附录
【王保明老师经典语录】
1)指针也是一种数据类型,指针的数据类型是指它所指向内存空间的数据类型
2)间接赋值*p是指针存在的最大意义
3)理解指针必须和内存四区概念相结合
4)应用指针必须和函数调用相结合(指针做函数参数)
指针是子弹,函数是枪管;
子弹只有沿着枪管发射才能显示它的威力;
指针的学习重点不言而喻了吧。
接口的封装和设计、模块的划分、解决实际应用问题;
它是你的工具。
5)指针指向谁就把谁的地址赋给指针
6)指针指向谁就把谁的地址赋给指针,用它对付链表轻松加愉快
7)链表入门的关键是分清楚链表操作和辅助指针变量之间的逻辑关系
8)C/C++语言有它自己的学习特点;
若java语言的学习特点是学习、应用、上项目;
那么C/C++语言的学习特点是:
学习、理解、应用、上项目。
多了一个步骤吧。
9)学好指针才学会了C语言的半壁江山,另外半壁江山在哪里呢?
你猜,精彩剖析在课堂。
10)理解指针关键在内存,没有内存哪来的内存首地址,没有内存首地址,哪来的指针啊。
3字符串和一级指针内存模型专题
3.1字符串基本操作
字符数组初始化方法
intmain11()
{
//1大{}号法初始化列表
//数组初始化有2种方法默认元素个数、指定元素个数
charbuf1[]={'
'
b'
c'
d'
e'
};
//若没有指定长度,默认不分配零
//若指定长度,不够报错;
buf长度多于初始化个数,会自动补充零
charbuf2[6]={'
charbuf3[6]={'
//charbuf4[5]={'
buf3:
%s"
buf3);
在C语言中使用字符数组来模拟字符串
C语言中的字符串是以’\0’结束的字符数组
C语言中的字符串可以分配于栈空间,堆空间或者只读存储区
//在C语言中使用字符数组来模拟字符串
//C语言中的字符串是以’\0’结束的字符数组
//C语言中的字符串可以分配于栈空间,堆空间或者只读存储区
intmain12()
//1用字符串来初始化数组
charbuf2[]={'
'
\0'
//2字符串常量初始化
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 传智播客 提高 讲义 扫地