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

看板Gossiping作者 (鈴谷のあまあま写生管理)時間3年前 (2022/06/04 12:17), 3年前編輯推噓8(809)
留言17則, 10人參與, 3年前最新討論串2/2 (看更多)
你要知道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.cc), 來自: 98.207.8.217 (美國) ※ 文章網址: https://www.ptt.cc/bbs/Gossiping/M.1654316253.A.615.html

06/04 12:20, 3年前 , 1F
其實未必吧 你重度指標一堆allocatio
06/04 12:20, 1F

06/04 12:20, 3年前 , 2F
n的話 快取不友善 效能反而出問題
06/04 12:20, 2F

06/04 12:20, 3年前 , 3F
請問 . 跟 -> 的差異呢?
06/04 12:20, 3F

06/04 12:21, 3年前 , 4F
結構用點 結構的指標用->
06/04 12:21, 4F

06/04 12:24, 3年前 , 5F
反正Python的list本質上也是指標
06/04 12:24, 5F

06/04 12:25, 3年前 , 6F
->是直接簡化*struct.val的方法吧?
06/04 12:25, 6F
是只能這樣用 指標只能用-> 結構只能用. 寫出*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

06/04 12:29, 3年前 , 7F
學C沒摸過C罩杯
06/04 12:29, 7F
※ 編輯: bluebluelan (98.207.8.217 美國), 06/04/2022 12:32:59

06/04 12:30, 3年前 , 8F
精確一點是(*pam).val簡寫為pam->val
06/04 12:30, 8F

06/04 12:31, 3年前 , 9F
r大的可以 取值之後用.ok
06/04 12:31, 9F

06/04 12:38, 3年前 , 10F
以前些韌體幾乎都是用指標
06/04 12:38, 10F

06/04 12:38, 3年前 , 11F
06/04 12:38, 11F

06/04 12:39, 3年前 , 12F
後來沒寫之後都忘光了 考試也都100分了
06/04 12:39, 12F

06/04 12:46, 3年前 , 13F
對 我也是這麼想的
06/04 12:46, 13F

06/04 13:01, 3年前 , 14F
嗶嗶嗶!內核 雙重指標
06/04 13:01, 14F
https://elixir.bootlin.com/linux/latest/source/include/linux/list.h#L843 怎麼了嗎 ※ 編輯: bluebluelan (98.207.8.217 美國), 06/04/2022 13:35:18

06/04 13:41, 3年前 , 15F
推文好認真討論 我還以為會有五樓3
06/04 13:41, 15F

06/04 13:41, 3年前 , 16F
公分這種推文= =
06/04 13:41, 16F

06/04 21:40, 3年前 , 17F
這最基本的 看不懂的別碰程式設計了
06/04 21:40, 17F
文章代碼(AID): #1YcjpTOL (Gossiping)
文章代碼(AID): #1YcjpTOL (Gossiping)