回覆列表
  • 1 # 使用者705820371121

    沒錯,指標就是一個地址。比如0x12345678是一個記憶體的地址,這個地方存有資料。

    但具體這個地址上的資料是一個整數,一個字元,還是另外一個位置的地址,完全看你的程式碼“怎麼看待它”。C語言裡是透過型別來描述這件事情的。你可以先認為它是一個byte,然後又改認為它是一個char,這也是可以的,對應到語言裡就是型別的轉換。

    但是“地址”到底怎麼變成記憶體的物理地址,是由CPU和OS共同起作用的。這個轉換的主要原因有:

    安全:OS需要支援多工,但是一個任務的程式程式碼不應該觸碰另外一個任務的資料物理記憶體有限:程式最好不要太關心這個限制,也不需要知道其他程式和OS也佔用了記憶體這個事實

    在x86的CPU中有真實模式和保護模式。前者對程式中的地址做了一個非常簡單的轉換(段+偏移);而後者做了複雜的轉換(GDT/LDT)。各個OS在這個保護模式的基礎上再做記憶體管理的具體實現,如頁表/頁框,頁錯誤和頁載入等。這時程式的“指標”是“虛擬地址”。這時,一個執行的程式無論如何也無法觸碰其他程式的記憶體資料,更無法觸碰OS自己的記憶體資料。此外每個程式都可以認為自己有很大的地址空間(32bit是4G,64bit是256T),只有物理記憶體不夠用時才會收到錯誤。

    而這一切對於C寫的程式在大面上都是透明的。C程式只知道自己寫了很多變數和指標而已。類似的,Java/C#等語言的“引用”也能大致相當於一個指標。但是這些語言因為安全性所以不允許對引用做指標運算,並且因為GC造成指標指向的位置可能會變,也不會給程式設計師一個明確的值。

    至於“指標”和“指標變數”,一般說“一個指標”,其實意思就是“一個指標型別的變數”。約定俗成的說法而已,不必較真。

  • 2 # 使用者5189701024573

    0=00000000→00000000=0x00

    1=00000001→10000000=0x80

    2=00000010→01000000=0x40

    3=00000011→11000000=0xC0

    在table[i]存的是i的位反向

  • 中秋節和大豐收的關聯?
  • 什麼越野車適合矮個子的人開?