有个朋友学C语言,学到指针直接崩溃,问我:"这指针到底是啥?为啥我赋值10它报错?"我叹了口气说:你见过谁家的房子,客厅里住着一串门牌号?
先别笑。今天我就用三个段子,把指针给你整明白,保证你看完直接开窍。
段子一:变量就是买房,指针就是中介
你定义 `int a = 10`,相当于你买了间房,房号是系统随机给的(比如101),房间里住着"10"这个人。你只能换人住(改a的值),但不能自己改房号。这就是为什么 `&a` 取出地址后,你没法给它赋新值------你见过谁给房号贴个新号码就往里硬塞人的?
好,中介来了。你定义 `int *p`,等于又买了一间房。但这间房特殊------它不能住人,只能住别的房的房号。比如 `p = &a`,就是让p这间房的客厅里贴着一张纸条,上面写着"101"。这时你查中介手里的纸条,就知道a住在哪。
段子二:指针变量为什么不能存普通数字?
有人非要把10塞进p里:`p = 10`。编译直接报错。为啥?因为p这间房的"装修"只允许放地址,你硬塞个人进去,房子直接炸了。就像你家快递柜只能放收件码,你非要往里扔个榴莲,柜门都关不上。记住了:指针变量存的是地址,不是值。地址是房号,值是住户,俩东西别搞混。
段子三:指向不同类型?中介也得专业
你定义 `int *p1`,然后想 `p1 = &x`(x是float)。编译器又怒了。为啥?因为p1这家中介只接整型房的单子。你把一个实数房的门牌号塞给它,它拿着纸条去推销,结果敲开门发现里面住着3.14,中介当场懵逼。这就像让房产中介去卖猪圈------专业不对口,容易出事故。
你看,指针概念就这么点东西。很多人觉得难,是因为老师上来就讲二级指针、函数指针,直接劝退。其实一开始你就记住三句话:
变量就是房间,地址就是房号,指针变量就是专门存房号的"中介"。
中介只能存地址,不能存人。
中介分专业,整型中介不能掺和浮点型的事。
把这仨段子吃透,再回头看 `scanf` 里的 `&`,你看它就顺眼了------那就是在告诉电脑:"嘿,把这个数塞进这个房号里去。"
指针不难,难的是没人用段子讲。今天你学会了,明天就可以去教别人,顺便说一句:"我这中介费不贵,点个赞就行。"