指针小故事——指针形象化理解:

1.内存、首地址的理解:

内存是C语言王国居民们(变量/函数/结构体……)赖以生存的土地。比如居民char的房子占地1字节,也就是1格土地;int4格土地……

每个居民的房子前面都会贴一个自己的地址,就叫做首地址。如果你哪天想拜访,只看他们第一格的首地址就行了。

2.*号的理解:

1)在int之类的声明后面,它是邮局局长——比如 int* p 翻译过来就是“p你好,从现在开始,你就是快递员了。于是p领了任务,出门工作了。

2)之后每当它和p相遇时,*号变成了一个搬运工,接待p吃一顿饭,把p携带的门牌地址拿过来,然后按图索骥,亲自前往执行。

3.p的理解:

p曾经也是个普普通通的变量,某天*号局长赋予了它一份工作,成为了一名快递员,也就是一个指针变量,p主要工作是:记录别人的地址,也就是门牌。

4.intchar…声明的理解:

它们是*号邮局局长手里的大红印章,给p授予快递员的工作。

这些大红印章也要分种类,就能让快递员记录不一样的门牌。比如:int类型的大红印让快递员找占地4格的房门牌,char类型让找占地1格的房门牌……

4.&号的理解:

它就是门牌

p=&a;表示——变量a小姐交给快递员p自己的门牌,欢迎他随时来玩(通过这个门牌,下次程序可以随时进入a的家里,修改里面的内容)

拓展内容:

p=a;表示——这种行为违反了C语言王国的法律。a是普通居民(变量),而p是快递员(指针)。C语言王国有规定:信息传递讲究门当户对,普通居民不能给快递员储存的内容,只能给自己的地址,否则是跨阶级的禁忌之恋。

不过,如果有一天,*局长批准a小姐也成为快递员(升级为指针),那么pa是同一阶级,门当户对,p能拿走a储存的东西了。

到这里我们也能猜到:此时a小姐只能给p自己存储的内容,不能给地址。除非p升级为二级指针,才能接收a小姐的地址。所以,给地址是一种跨级的行为。

5.指针的移动的理解:

1)如前文所讲,p的出门在外大部分工作只是找门牌地址,然后报告给*局长

有时候,需要找的门牌号是有规律的,比如依次往下找2格内存、找3格内存……

之前*号局长告诉p听着,我给你盖的是int的红印,所以你是int类快递员,你每次能移动4格噢

所以p在外出工作时,会思考:

p++就是4格的门牌,往后推算1个,一共加4”,所以它会往下找4格;

p+100就是4格门牌,往后推算100格,一共加400呢!所以它会往下找400格。

6.指针越界的理解:

p带回来的信息,有时会使程序发生指针越界的事故。例如快递员p按照人类错误的指示,带回了一个门牌地址,结果这个地址指的是境外的非法之地。导致*局长按快递员p带回的信息,前往执行时进入了非法之地,程序发生严重的报错!!

*局长回来后大骂了一通p你可把我害惨了啊。你怎么指到那个鬼地方了?

p欲哭无泪:是人类让我寻找啊,我也不知道那个地址通向何方……”

*局长也没办法,同时非常后怕,喃喃自语:幸亏软件报错了,才能让程序停下来……就怕这个地址没有动用系统内存,有错误都不报错,到时候……就恐怖了……”

7.野指针与空指针的理解

如上图,

第一行:p被授予了一个int快递员的工作。

第二行:但是他从邮局里出来,不知道要去指向谁。正当他着急时,*局长却出现在他身边,跟他要结果。为了交差,p干脆随便赋了个地址交给局长。

此时的p还没有意识到事情的严重性,当局长拿着这个未知的地址,前往执行,很可能会遭遇危险……

p没有工作时,为了防止p不安分,*局长会安排他进入NULL里面暂时休息,这就是空指针。

8.数组c[ ]的理解:

数组c其实和p这样的快递员小哥一样,都是记地址的打工人。不过,c更为训练有素,而且自出生C语言术语——声明)那一天起,他就是强悍的快递员。但是c远不如p自由。

从出生这一天起,c命中注定只能守着这三个房子。

c随身携带着[ ],这个东西可以明确告诉他去第几间房子取东西。[1]就表示去第二间房

实战练习1

如上图这段代码形象解析:

有一天,p快递小哥从邮局里出来,接到了一个任务:去接替c一下的职务。

于是p去看望了c,发现c正在守着3间房子呢!

c赋予给了p

c感到奇怪,问他:你来到这里,不要我的&么?

p笑着说:我要你的门牌号干什么?我来只是做做你的工作而已。所以写成p=c啦。

pchar级别的快递员,所以每走一步,只能读取1间房子。若要读取完c的房子,就得走3步,也就是3格。

p默认读取到的是c[0]。所以他读取完第一间房时,如果想让他读下一间,就必须+1移动1格查第二间,然后又+1移动1格查第三间。

每次读取的时候,将地址汇报给刚过来的*局长,局长前往执行,将实际数据以16进制的方式传达给 printf 等高层领导。

实战练习2

有一天,p又接到任务,去接替c的工作。

不过这次p过去的时候,发现c的房子升级成了int类型。

p要查房时,c阻止了他:你是char类型的,一次只能移动1格内存,而我的一个房间占4格,你不能这样。

这样的话会导致数据不能对齐。所以你也要升级为int类型的快递员,一次移动4格,这样就能对齐了

9.快递员之间的任务接替:

p经常帮别人干活,比如上文的p=c,这个等于号相当于接过c手中的活

10.malloc的理解:

1malloc简介:malloc土地监管局的,从大学毕业,和邮局有合作关系。

他的职务是——

可以随时随地划分土地C语言术语——申请内存)

若没有收到*局长的指示,默认盖void类型。(这种门牌表示土地大小随意,是通用的。)土地划分完成后,记录该处的地址,此时他的职务是快递员。此时*局长会带着印章过来,授予malloc快递员类型,让它盖这种类型的房子。

2

视频中的例子:

程序需要一个3x4=12格大小的土地,malloc就会在王国里随便找个地,划分一块这么大的土地,然后把这块地的地址交给p快递小哥:土地我已经划分好啦,*局长刚才给我盖了章,让我盖int类的房子,也就是每间房子占4格,你之后带着*局长前来获取里面的内容吧。地址给你!

p临走时有个疑问:为什么不带着&给我呢?

malloc翻了个白眼:我要给你的是我储存的地址,而不是我家的地址。怎么?你要带着局长去我家啊?

malloc又笑了:你又不是二级指针,可没权力向我要地址哦。别忘了,给地址是跨阶级的。

后来p带着*局长,挨个地记录了这3间房子储存的数据。

再看个例子,回顾一下这个故事的重点:

分成两部分看:

等号右边——malloc申请了20格的土地资源,并记录了这些土地的地址,*使这个地址转化为int型,导致分成了204=5个门牌。

等号左边——声明了一个int型的快递员p,并让p储存了右边malloc记录的地址。

11.数组、加了&的变量——都是指针

  • 2
  • 5
  • 12

你可能感兴趣的:(c语言)