社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
在学习C语言的过程中,要说最大的难关,非指针莫属。
关于指针的学习,我们经常会听到下面这样的建议:
“只要理解了计算机的内存和地址的概念,指针什么的就不在话下了。”
“因为C是低级语言,所以先学习汇编语言比较好。”
的确,在理解C指针时,如果已经对内存和地址的概念有所了解,就会快很多。但是,仅懂得内存和地址的概念,是无法掌握指针的。理解内存和地址的概念可能是理解指针的必要条件,但并不是充分条件。这只是“万里长征”的第一步。
观察一下初学者实际使用指针的过程,就会发现很多下面这样的问题。
0
1
用int *a;声明指针变量……到这里还挺像样的,可是当将这个指针变量当作指针使用时,依然悲剧地写成了*a。
0
2
写出了int &a;这样的声明(←拜托,这又不是C++)。
0
3
什么是“指向int的指针”?指针不就是地址吗?怎么还有“指向int的指针”“指向char的指针”,难道它们还有什么不同吗?
0
4
当学习到“给指针加1,指针会前进2个字节或4个字节”时,可能会有这样的疑问:“指针不就是地址吗?在这种情况下,难道指针不应该是前进1个字节吗?”
0
5
“对于scanf(),在使用%d的情况下,需要在变量前加上&才能传递参数。可是,为什么在使用%s时就可以不加&呢?”
0
6
当学习到将数组名赋给指针时,将数组和指针混为一谈,犯下“把未分配内存空间的指针当作数组访问”或者“试图把指针赋给数组名”这样的错误。
出现以上混乱情形,并不是因为没有理解“指针就是地址”,真正的原因是:
C语言奇葩的声明语法
数组与指针之间微妙的兼容性
看到这里说C语言的声明语法奇葩,估计有人会不明所以。那么,大家是否有过如下疑问呢?
在C语言的声明中,[]的优先级比*高,所以char *s[10];这样的声明表示“指向char的指针的数组”——弄反了吧?
搞不明白double (*p)[3];和void (*func)(int a);这样的声明到底应该怎样阅读。
int *a;表示把a声明为“指向int的指针”,但表达式中的*却也可以对指针进行解引用。明明是一样的符号,为啥意思却相反?
int *a和int a[]在什么情况下可以互换?
空的[]可以在什么地方使用,代表的又是什么意思?
如果你也有,那么不妨读一读下面这本书。
点击上图购买
[日]前桥和弥——著
朱文佳——译
为你扫清关于指针的一切问题!
这是一本专门讲解C指针的书。
本书作者是日本知名的“毒舌程序员”,其言辞犀利,观点鲜明,擅长将复杂的知识浅显易懂地讲清楚。本书结合作者多年的编程经验和感悟,从C指针的概念讲起,通过实验一步一步地揭示了指针和数组、内存、数据结构的关系,展现了指针的常见用法,揭示了各种实用技巧,还通过独特的方式告诉读者怎样解读C语言那些让人“纠结”的声明语法,以及如何绕过C指针的陷阱等。
指针被誉为“C语言的灵魂”,想要运用自如并非易事。事实上,上网一搜就会看到,“C指针好难啊”的抱怨比比皆是。即便是自认为“C语言很简单嘛,指针什么的我已经完全掌握了”的老手,其实也可能只是知其一不知其二。
例如,大家可以确认一下自己是否知道下面这些事实。
在引用数组中的元素时,a[i]中的[]其实跟数组没半点关系。
C语言中不存在多维数组。
如果你不了解,那么也不妨读一读本书。
对于指针之难学,作者一阵见血地指出:
“理解不了C指针不是你的错,是C语言的语法太坑人了,仅此而已!”
实际上,作者也是在使用C语言好几年之后,才真正明白其“奇葩”的语法的。而作者写这本书的初衷,也就是希望和他一样曾为指针感到苦恼的人,在阅读本书时,能够发自内心地感慨:“要是那个时候上天能让我遇见这样一本书,该有多好啊!”
本书特色
直击学习难点,打通C语言任督二脉
在幽默的“毒舌吐槽”中参透指针
作者20余年一线经验沉淀,讲解精妙
左右滑动查看
原版长销20年,经典经得起时间考验
此新版重磅升级!
不只是初学者,本书也适合有一定经验的程序员阅读。在深入理解了C语言的语法之后,对于那些迄今为止一直使用的惯用写法,就能够“知其然知其所以然”了。
【今日互动】
你觉得学习C语言的过程中,最难的部分是什么?
欢迎大家留言分享,评论里点赞最高的小伙伴将会获得新书《征服C指针(第2版)》1本!
活动截止时间:2021年4月5日。
【推荐阅读】
喜欢这篇文章?点个“在看”吧~▼
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!