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

上传人:b****1 文档编号:395722 上传时间:2023-04-28 格式:DOCX 页数:99 大小:1.47MB
下载 相关 举报
传智播客C提高讲义扫地僧Word下载.docx_第1页
第1页 / 共99页
传智播客C提高讲义扫地僧Word下载.docx_第2页
第2页 / 共99页
传智播客C提高讲义扫地僧Word下载.docx_第3页
第3页 / 共99页
传智播客C提高讲义扫地僧Word下载.docx_第4页
第4页 / 共99页
传智播客C提高讲义扫地僧Word下载.docx_第5页
第5页 / 共99页
传智播客C提高讲义扫地僧Word下载.docx_第6页
第6页 / 共99页
传智播客C提高讲义扫地僧Word下载.docx_第7页
第7页 / 共99页
传智播客C提高讲义扫地僧Word下载.docx_第8页
第8页 / 共99页
传智播客C提高讲义扫地僧Word下载.docx_第9页
第9页 / 共99页
传智播客C提高讲义扫地僧Word下载.docx_第10页
第10页 / 共99页
传智播客C提高讲义扫地僧Word下载.docx_第11页
第11页 / 共99页
传智播客C提高讲义扫地僧Word下载.docx_第12页
第12页 / 共99页
传智播客C提高讲义扫地僧Word下载.docx_第13页
第13页 / 共99页
传智播客C提高讲义扫地僧Word下载.docx_第14页
第14页 / 共99页
传智播客C提高讲义扫地僧Word下载.docx_第15页
第15页 / 共99页
传智播客C提高讲义扫地僧Word下载.docx_第16页
第16页 / 共99页
传智播客C提高讲义扫地僧Word下载.docx_第17页
第17页 / 共99页
传智播客C提高讲义扫地僧Word下载.docx_第18页
第18页 / 共99页
传智播客C提高讲义扫地僧Word下载.docx_第19页
第19页 / 共99页
传智播客C提高讲义扫地僧Word下载.docx_第20页
第20页 / 共99页
亲,该文档总共99页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

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

《传智播客C提高讲义扫地僧Word下载.docx》由会员分享,可在线阅读,更多相关《传智播客C提高讲义扫地僧Word下载.docx(99页珍藏版)》请在冰点文库上搜索。

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

指针铁律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字符串常量初始化

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2