精華區beta C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 我們都知道 為了要讓指標能夠正常運作 必須要宣告指標的型別 當指標在跳位置取值的時候 才不會跳錯 但是小弟今天有一個疑惑 "那儲存指標的型別資訊是儲存在計算器的哪一部分?" 也就是說 她怎麼記得這個指標是屬於哪個型別 小弟的計概不好 但Google也看不出頭緒 有勞各位前輩 餵入的資料(Input):預期的正確結果(Expected Output):錯誤結果(Wrong Output):程式碼(Code):(請善用置底文網頁, 記得排版) 補充說明(Supplement): 無 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 125.227.195.157 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1474279464.A.951.html 很想知道答案 敬至答者 1000P (不含稅) 限版上回覆 謝謝大家>< ※ 編輯: wa007123456 (125.227.195.157), 09/19/2016 18:19:23
descent: intptr_t, uintptr_t 可以用來存指標的值 09/19 18:41
wa007123456: 謝謝樓上關鍵字! 所以她跟編譯器有關係囉? 09/19 18:44
chuegou: 寫過組語就知 編譯器要 09/19 18:47
wa007123456: 也許這篇轉組語比較好 不過樓上好像有話要說@@ 09/19 18:48
chuegou: 編譯器要決定讀的大小 09/19 18:49
wa007123456: descent 已授予 1000P.... 另外版友chuegou能提供相 09/19 18:49
wa007123456: 好的 也有第二位拿1000P 不過我希望有一個完整的答案 09/19 18:51
wa007123456: 就是她整個在編譯過程的原理>< 09/19 18:51
wa007123456: 不好意思囉 囧 09/19 18:53
CaptainH: 型態都在編譯時決定 09/19 18:57
james732: 編譯器通常會維護表格,記錄所有變數的type以正確使用 09/19 19:04
ctrlbreak: 3樓應該就是答案了, 型態只編譯器和人需要知道而已XD 09/19 22:58
> -------------------------------------------------------------------------- < 作者: descent (「雄辯是銀,沉默是金」) 看板: C_and_CPP 標題: Re: [問題] 指標型別的疑惑(贈送1000P) 時間: Mon Sep 19 19:29:36 2016 ※ 引述《wa007123456 (大笨羊)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : VC++ : 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) : 問題(Question): : 我們都知道 為了要讓指標能夠正常運作 : 必須要宣告指標的型別 : 當指標在跳位置取值的時候 才不會跳錯 : 但是小弟今天有一個疑惑 : "那儲存指標的型別資訊是儲存在計算器的哪一部分?" : 也就是說 她怎麼記得這個指標是屬於哪個型別 int main() { int i, j; } 編譯器要為 i, j 在記憶體留個位置, 所以需要知道 int i, j 要給多大, 寫 c 編譯器的人就要去查 c 規格書, 哦 int 我留個 4byte 就符合規格了。 所以會把 0x100 留給 i, 0x104 留給 j。 那如果是 int *p, *q; 呢? 編譯器要留 uintptr_t 的大小給 p, q, 假設 uintptr_t 是 4byte 好了, 所以把 0x108 給 p, 0x10b 給 p。 大小有了, 型別要怎麼紀錄呢? 用表格, p, int * q, int * i, int j, int 這樣編譯器就幫這些變數保留了大小, 也知道這些變數的型別。 0x100 ~ 0x10b 為虛構的位址, 依平台不同而不同。 > -------------------------------------------------------------------------- < 作者: CoNsTaR ((const *) 看板: C_and_CPP 標題: Re: [問題] 指標型別的疑惑 時間: Mon Sep 19 23:05:23 2016 descent 大大在前面已經講的很清楚了,就當我這篇是幫他補充吧~ 程式執行的時候會有好多種狀態 (state) 凡是可以被你“參數化”的東西都可以看成是 state 例如:值 有些 state 是一定得在 compile-time 決定的 例如:常數(像是編譯日期) 有些 state 則是在 runtime 才能夠決定的 例如:user input 大部分的 state 都是既能夠在 compile-time 決定,也能在 runtime 決定的 為了增進程式的效能,我們會把一些在 compile-time 就能夠決定的 state 紀錄在 type 裡面,成為「型別資訊」 為了讓程式更有彈性,我們會把一些 state 留到 runtime 才決定,當然,有時候型別資 訊也是 runtime 決定的 以 C 語言來說,變數在記憶體中的大小是 compile-time 決定的(大部分情形下) 而且被記錄在型別資訊裡頭,可以利用 sizeof 運算子來向編譯器取得 所以這個數字可能不會存在於已經編譯好的程式中,而只出現在編譯時期 推薦原 Po 可以去了解靜態型別和動態型別的不同,兩者的做法是不同的 要是還有興趣,推薦了解一下 type theory,可以讓你有更高一層的視野