【C語言入門】178.指標與指標間的強制轉型

在這篇文章,我們來介紹一下指標與指標間的強制轉型。

某個型別的指標,可以轉成 void 的指標,並且從void 的指標轉回那個型別的指標。

這是通過隱性轉型,比較相對安全可靠的方法。

指標和指標之間的互轉也需要通過強制轉型,不過強制之前,我們先來看看 C 語言中的記憶體對齊。

每個型別對齊的大小是實作定義的,每個編譯器對每個硬體可以設計不同的對齊。

為了提升效率,我們可以限制只能在 0 號、2號、4號、6號、8號。

也就是每跳 2 格才可以擺一個整數,這樣 int 的對齊就成為 2,如下圖。

限制只有部分格子能放可以放整數的好處是甚麼?

好處是硬體會比較有效率,只需要在偶數的位置處理讀整數的功能,,而不是所有的位置都處理這件事。

同樣的道理,我們也可以讓整數的對齊設為 4 。

我們也可以把 int 的對齊設為 4 ,這樣 0、4、8、12 都是可以存放 int 的。

那對齊會影響的是哪些的位置是合法的記憶體位址,也就是指標能存的位址有哪些。

假設今天有另外一個型別 —— 字元,我們知道它的大小是對齊的,字元對齊的大小是 1 ,一定會佔據一個位元組。

也就是說,每個字元,char,可以存在所有的格子裡。

每個位置都可以存一個 char。

那所有可以存 char 的位址一定可以存 int 嗎?

不可以的,因為 char 的對齊比 int 的對齊小,可以存 char 的位址不一定可以存 int。

可以存 int 的位址一定可以存 char 嗎?

是可以的,因為 int 的對齊為 4,char 的對齊為 1。

那回到我們一開始討論的,如果我們要從 TypeA 轉到 TypeB ,然後再從 TypeB 轉回 TypeA。

我們只要能夠確保 TypeA 的對齊大於 TypeB 的對齊,這樣我們還是有機會可以轉回來的。

Leave a Comment

Your email address will not be published. Required fields are marked *