→ 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,可以讓你有更高一層的視野