Re: [问卦] 有没有学习 C 语言指标的好方法?

楼主: HuangJC (吹笛牧童)   2020-09-20 02:20:48
我们从机械语言寻址法说起好了
绝对寻址法:
比如,从位址 0x300 取出值,放入累加器
间接寻址法:
比如,从位址 0x300 取出值,这个值又当成位址,再去该位址取出其值,放入累加器
组合语言应该是不会那么三八,给你两层三层的间接寻址的
但 C 语言可以,每多打一个星号取出其值,就是取出的值再间接寻址一次
但事实上还不是凑出来的 :P
前面说了,值取出后放入累加器
那我就把累加器的值不当值,当成位址,再取一次就好啦
在机械语言里这么直观的东西
在 C语言里,说"为了你方便",有点不一样
0x300+1 是多少? 0x301 嘛,对吧~
但如果在 C, 就会说指标指的物件是有 size 的
如果是个 word, 那么 0x300 + 1(word) = 0x302
也就是那个 1,必需赋与单位,单位是 word
就这样而已,差别不大 XD
但这在阵列里算好用的
比如一个 size = 32 byte 的元素
0x300 + 1(32byte) = 0x320
在阵列就真的好用
要把 0x300 当数值用时,比如当 word, 其实就是 (word)0x300
就算它本来是指标,也会被 cast 成 word
要把 0x300 当指标用时,就算它本来是word, 只要你 cast 下去,就会变指标
(void*)0x300 像这样,它就变指标
一般来说,我们不胡搞,以免自己受不了
可是当你在看别人程式时,你无法禁止别人胡搞
如果跨模组时,直接胡搞更是把不同模组黏起来最快的方法
就像拿全域变量写程式一样,又爽又危险 XD
所以就算本来宣告 int ***a; 说 a 是个三层指标好了
可是我要用时,马上 cast (int**)a 这样用
你受不了又怎样呢?就是可以 XD
一个变量要被视为什么,是要'活在当下'的
当下怎么用它,它就是什么
如果你不确定,就多步进执行或加 print 去看它
而因为指标的加一减一,事实上是带单位的
所以记得 sizeof 偶尔要用用,去检查检查它是不是你所想的那么一回事
回到 怎么学能学好
你要故意学很高深当然可以,就好像学生时微积分学到很难,出社会后好像没在用
你常用的程度自然就会熟了
我是蛮爱用指标的,因为它可以创造物件的分身
写程式时要注意本尊只有一个,其他都用分身
这样的好处是不用注意物件的 sync 问题
比如, a=3 , b=a, 然后 a=4
b 是拷 a 的值,但 a 改成 4 之后,b 却没一起改
这就是复制的缺点
用分身的话,a 的改变,b 不用通知也会跟着变,多好...
而一堆人都要用变量,到底把本尊放在哪好?
那就是程式架构的问题了
本尊一定要最早产生,最后消灭
如果没这特性,比如上面的 a 先消灭,b 又保留 a 的值要继续使用
那 b 不就从分身转而为本尊的地位?
这么复杂的拥有权转移,很容易让人晕头转向的
但也不是绝对不做;观念清楚就可以
于是我们渐渐会确立物件是个有形有质的'东西'
要好好保管,或好好转移拥有权
这有形有质的概念坚持下来,物件导向就很有感觉
物件导向不是 class, private, public, method 这些字眼而已
它就是把一群变量好好的当成物件去保管,以有形有质去对待它
有这概念,就算用 c 都可以写出物件导向
我第一次写二元数排序,照着课本做就失败了
后来连续做两次都失败,但我确定校对两次,绝对没打错
结论很简单:课本印错了,误人子弟 XD
(第一次成功,就是抛开课本,自己写就成功了)
若再加上硬 cast 指标以让程式会动的这些 code
可以说糊成一团粥的机率大增
那还是会自己检查指标比较重要
检查下去你就知道那些指标运算在干麻
像 COM 的宏里也在运算指标,我看了就很晕
但拆开来步进一下就懂
作者: abadjoke (asyourlife)   2020-09-20 02:21:00
看了这一串 我还是乖乖待python 就好了
作者: koreawargod (高丽战神金正恩)   2020-09-20 02:24:00
看完这篇...我今晚可以很好睡了
作者: YAYA6655 (YAYA)   2020-09-20 02:24:00
作者: sef96121   2020-09-20 02:28:00
有看有推
作者: DDxMM (停不下来)   2020-09-20 02:30:00
不同环境平台指标用多了会出现奇奇怪怪现象
作者: pearlsally (yllaslraep)   2020-09-20 02:30:00
牛逼 第一次学树 堆的时候真d痛苦
作者: turorach (土魠雷丘)   2020-09-20 02:32:00
以前一直对物件导向不太了解,都傻傻地用
作者: DDxMM (停不下来)   2020-09-20 02:35:00
大端小端对齐就够你搞,还是不要用指标比较通用
作者: zero00072 (赤迷迭)   2020-09-20 02:39:00
感谢分享!物件本尊分身那跟档案系统的 inode link 好像。
作者: DarkIllusion (′・ω・‵)   2020-09-20 02:43:00
用c做出物件导向的特性会有点累
作者: patentstm (暖暖苗圃没有树...)   2020-09-20 02:49:00
推字多好睡~
作者: r34796a (安安你好)   2020-09-20 02:54:00
看得半懂 但有收获 推
作者: Nigger5566 (尼哥56)   2020-09-20 03:00:00
浅显易懂,赞
作者: buke (一坪的海岸线)   2020-09-20 03:06:00
推 看来我还是乖乖写php就好
作者: pizzafan (七情三想)   2020-09-20 04:46:00
只要看到书里写连两个星号**才认为4高手的 把牠当渣就好故意复杂化、玩符号艰涩耍婊艺术 高来高去的 都当渣就好老外教学 也没有教人专练这种功 来婊人的 有叫他去吃屎

Links booklink

Contact Us: admin [ a t ] ucptt.com