2013-07-30 117 views
2

我只是好奇,想知道會是什麼sizeof指針返回來了16位和32位系統SIZEOF指針16位和32位

printf("%d", sizeof(int16 *)); 
printf("%d", sizeof(int32 *)); 

謝謝。

+0

在16位它將是2,而在32位將是4. –

+0

你的意思是意味着如果'sizeof(void *)'=='8'表示它的64位,並且它的sizeof(void *)== == 4則表示32位。 –

+2

如果您不清楚系統的類型,這不是一個可以回答的問題。 16位代碼通常有不同類型的指針來處理限制。獲得4並不罕見。指針的大小與指向對象的大小完全無關。 –

回答

3

簡短回答:在32位英特爾386上,您可能會看到這些返回4,而針對16位8086,根據您選擇的內存型號,最有可能看到2或4。

細節

首先標準C並沒有規定關於指針什麼特別,只是他們需要能夠以「點」給定的變量,指針運算需要的數據區域內工作給定的變量。即使是一個具有指針異常表示的C解釋器也是可能的,並且考慮到這種靈活性,指針實際上可能具有任何大小,具體取決於您的目標。

通常編譯器確實代表內存地址的指針,這使得C標準「通常工作」未定義多個操作。編譯器如何選擇表示指針的方式取決於目標體系結構:編譯器編寫者顯然選擇既有用又有效的表示。

有用的表示的示例是Harward體系結構微指令上的通用指針。它們允許您解決代碼和數據RAM問題。在8位微碼上,它們可能被編碼爲一個字節加上2個地址字節,這顯然意味着無論何時你引用一個這樣的指針,都必須發出更復雜的代碼來從適當的位置加載內容。

這給出了一個很好的例子高效表示:爲什麼沒有特定的指針呢?一個指向代碼存儲器,另一個指向數據存儲器?只需2個字節(假設像8位微處理器那樣的16位地址空間,例如8051),並且不需要按類型選擇。然後你有多種類型的指針,呃(再次是8051:你可能至少有一個額外類型的指針指向它的內部RAM也是......)。程序員然後需要考慮他需要使用哪種特定的指針類型。

當然,尺寸也不同。在這個針對8051的假設編譯器中,您將具有3字節的通用指針類型,2字節的外部數據存儲器指針類型,2字節的代碼存儲器指針以及1字節的內部RAM指針類型。

另外請注意,這些類型的指針,並數據,它們指向(函數指針的類型是有點過這裏的事實指針的函數指針意味着它是一個不同的類型不是數據指針,除了指向的數據類型是函數類型之外,沒有任何特定的語法差異。

回到你的16位機器,假設它是8086:

如果你使用一些內存模型,其中編譯器假定你有一個數據段,你可能會得到2個字節的數據指針,如果你不這樣做特別聲明一個nearfar。否則默認情況下你會得到4個字節的指針。 2字節指針的表示通常只是16位偏移量,而對於4字節指針則是段:偏移量對。您始終可以應用nearfar說明符來明確地將指針指定爲一種或另一種類型。

(如何near三分球也使用far指針的程序工作?只要有編譯器生成一個默認的數據段,和所有near s的位於內。編譯器可以簡單地永久,或至少大部分時間,有ds段寄存器填充默認的數據段,所以訪問near指出的數據可以更快)

+0

感謝您的回答!這是真的徹底..:D –

-3

指針的大小取決於體系結構。準確地說,它取決於該體系結構中使用的地址大小,該大小反映了訪問存儲器的總線系統的大小。

例如,在32位體系結構的地址的大小是4個字節:

sizeof (void *) == 4 Bytes. 

在64bits的,addreses具有大小爲8個字節:

sizeof (void *) == 8 bytes. 

注意,即所有的指針具有相同的尺寸和類型相互依賴。所以如果你執行你的代碼,一個int16指針的大小和int32指針的大小將是相同的。

但是,16位系統上指針的大小應爲2個字節。通常情況下,16位系統的內存非常少(幾兆字節),2個字節足以滿足其所有位置。更確切地說,使用16位指針,您可以擁有的最大內存大約爲65 KB。 (與今天的計算機的內存量相比確實很少)。

+3

指針的大小由C實現選擇。基礎架構在邏輯上強加了要求,但它並沒有對尺寸做出最終決定。 C語言被設計爲非常靈活,並已在許多不同的機器和體系結構上實現,其中一些具有不尋常的尋址功能。 –

+3

**否**。 C標準中沒有任何內容強制指向'int16'的指針與指向'int32'的指針的大小相同。 –

+0

16位可以有65k個不同的值,而不是65M。 – liori