PTT推薦

Re: [問卦] 指標是不是只有C語言才有的玩死人的把

看板Gossiping標題Re: [問卦] 指標是不是只有C語言才有的玩死人的把作者
bluebluelan
(鈴谷のあまあま写生管理)
時間推噓 8 推:8 噓:0 →:9

你要知道C的出現是在那種記憶體還是用幾KB幾KB算的年代

每一點記憶體都很珍貴 每一個CPU時脈都很珍貴


所以出現了指標這種東西允許我們直接改記憶體裡頭的值

一直到現代的作業系統內核基本上都還是C的天下


原因無他 就是快 指標指哪改哪 對於習慣用C的人 腦海裡頭都是指標

假設我們有一塊記憶體裡頭存著五樓的老二尺寸

你直接看記憶體位置

0x1000: 0x1E

0x1001: 0x5

發現不知道這是什麼意思 就只是一個非零值而已



但是我們可以用一個數據結構的指標直接去解讀

struct dick_spec {
uint8_t length;
uint8_t diameter;
};



struct dick_spec *big_dick = 0x1000;

big_dick->length 這個時候就是0x1000 裡頭的 0x1E 也就是十進制的30

代表五樓老二的長度 是 30cm

big_dick->diameter 也就是0x1001的值 0x5 也就是直徑 5cm


指標就是那麼方便 我們把五樓老二的尺寸放在記憶體位址0x1000

用一個數據結構的指標讀出來 就可以馬上拿到30cm 5cm這兩個數字

還只要2bytes


同時你還能有一個 struct dick_spec *small_dick = 0x1000;

想要竄改五樓老二的尺寸

small_dick->length = 0x3;

small_dick->diamter = 0x1;


五樓的老二尺寸就變成三公分 直徑一公分這種袖珍尺寸


那0x1000的值就是0x3 0x1001 就是 0x1了



如果你是用其他語言 勢必要花更大的記憶體空間

即使只是C++宣告一個Class裡頭只有length 跟 diameter各一個byte

外頭的C++包裝可能多了幾個數量級不只



業界真的在用 最多就是雙重指針 ** 再往上的操作都可以簡化到雙重指針


C的本質就是記憶體操作 C++雖然也能做 但是他是被設計拿來當OO用的

要記憶體操作 還是用C就好

※ 引述《iLeyaSin365 (365)》之銘言:
: 指標
: * 取值
: & 取址
: 兩個基本的簡單符號
: 然後人們就自己衍生出什麼指標陣列、
: 陣列指標、指標的指標.....
: 指來指去,搞死自己。
: 結果好像除了C語言家族(包含golang Rust)
: 其他語言也沒什麼在那裡瘋狂用指標這種東西
: 所以沒有指標其實也可以
: 那麼為何C要那麼重指標 然後還要
: 運用得那麼複雜呢?
: 是不是用來整人的玩意 有沒有掛
:

--

※ PTT 留言評論
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 98.207.8.217 (美國)
PTT 網址

lturtsamuel 06/04 12:20其實未必吧 你重度指標一堆allocatio

lturtsamuel 06/04 12:20n的話 快取不友善 效能反而出問題

freertos 06/04 12:20請問 . 跟 -> 的差異呢?

JustBecauseU 06/04 12:21結構用點 結構的指標用->

JustBecauseU 06/04 12:24反正Python的list本質上也是指標

radstar 06/04 12:25->是直接簡化*struct.val的方法吧?

是只能這樣用 指標只能用-> 結構只能用. 寫出*struct.val這種東西你要先思考 為啥非得這樣寫不可 你都有struct這個指標了 何必再來個*struct.val這種東西 直接用->就好了 雖然對編譯器而言都一樣 但對看code的人類就像是有屎沒拉出來一樣 struct dick_spec ur_dick; struct dick_spec *dick_ptr = &ur_dick; ur_dick.length; //Good dick_ptr->length; //Good ur_dick->length; // Compile Error dick_ptr.length; // Compile Error

※ 編輯: bluebluelan (98.207.8.217 美國), 06/04/2022 12:29:03

loadingN 06/04 12:29學C沒摸過C罩杯

※ 編輯: bluebluelan (98.207.8.217 美國), 06/04/2022 12:32:59

radstar 06/04 12:30精確一點是(*pam).val簡寫為pam->val

JustBecauseU 06/04 12:31r大的可以 取值之後用.ok

WunoW 06/04 12:38以前些韌體幾乎都是用指標

WunoW 06/04 12:38

WunoW 06/04 12:39後來沒寫之後都忘光了 考試也都100分了

gin666 06/04 12:46對 我也是這麼想的

dces4212 06/04 13:01嗶嗶嗶!內核 雙重指標

https://elixir.bootlin.com/linux/latest/source/include/linux/list.h#L843

怎麼了嗎

※ 編輯: bluebluelan (98.207.8.217 美國), 06/04/2022 13:35:18

xsdferty035 06/04 13:41推文好認真討論 我還以為會有五樓3

xsdferty035 06/04 13:41公分這種推文= =

booth 06/04 21:40這最基本的 看不懂的別碰程式設計了