1.内存、首地址的理解:
内存是C语言王国居民们(变量/函数/结构体……)赖以生存的土地。比如居民char的房子占地1字节,也就是1格土地;int占4格土地……
每个居民的房子前面都会贴一个自己的地址,就叫做首地址。如果你哪天想拜访,只看他们第一格的首地址就行了。
2.*号的理解:
(1)在int之类的声明后面,它是邮局局长——比如 int* p 翻译过来就是“p你好,从现在开始,你就是快递员了”。于是p领了任务,出门工作了。
(2)之后每当它和p相遇时,*号变成了一个搬运工,接待p吃一顿饭,把p携带的门牌地址拿过来,然后按图索骥,亲自前往执行。
3.p的理解:
p曾经也是个普普通通的变量,某天*号局长赋予了它一份工作,成为了一名快递员,也就是一个指针变量,p主要工作是:记录别人的地址,也就是门牌。
4.int,char…声明的理解:
它们是*号邮局局长手里的大红印章,给p授予快递员的工作。
这些大红印章也要分种类,就能让快递员记录不一样的门牌。比如:int类型的大红印让快递员找占地4格的房门牌,char类型让找占地1格的房门牌……
4.&号的理解:
它就是门牌,
p=&a;表示——变量a小姐交给快递员p自己的门牌,欢迎他随时来玩(通过这个门牌,下次程序可以随时进入a的家里,修改里面的内容)。
拓展内容:
p=a;表示——这种行为违反了C语言王国的法律。a是普通居民(变量),而p是快递员(指针)。C语言王国有规定:信息传递讲究门当户对,普通居民不能给快递员储存的内容,只能给自己的地址,否则是跨阶级的禁忌之恋。
不过,如果有一天,*局长批准a小姐也成为快递员(升级为指针),那么p和a是同一阶级,门当户对,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啦。”
p是char级别的快递员,所以每走一步,只能读取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的理解:
(1)malloc简介:malloc是土地监管局的,从
他的职务是——
①可以随时随地划分土地(C语言术语——申请内存)。
若没有收到*局长的指示,默认盖void类型。(这种门牌表示土地大小随意,是通用的。)②土地划分完成后,记录该处的地址,此时他的职务是快递员。此时*局长会带着印章过来,授予malloc快递员类型,让它盖这种类型的房子。
(2)
视频中的例子:
程序需要一个3x4=12格大小的土地,malloc就会在王国里随便找个地,划分一块这么大的土地,然后把这块地的地址交给p快递小哥:“土地我已经划分好啦,*局长刚才给我盖了章,让我盖int类的房子,也就是每间房子占4格,你之后带着*局长前来获取里面的内容吧。地址给你!”
p临走时有个疑问:“为什么不带着&给我呢?”
malloc翻了个白眼:“我要给你的是我储存的地址,而不是我家的地址。怎么?你要带着局长去我家啊?”
malloc又笑了:“你又不是二级指针,可没权力向我要地址哦。别忘了,‘给地址’是跨阶级的。”
后来p带着*局长,挨个地记录了这3间房子储存的数据。
再看个例子,回顾一下这个故事的重点:
分成两部分看:
①等号右边——malloc申请了20格的土地资源,并记录了这些土地的地址,*使这个地址转化为int型,导致分成了20➗4=5个门牌。
②等号左边——声明了一个int型的快递员p,并让p储存了右边malloc记录的地址。
11.数组、加了&的变量——都是指针