2011-07-19 54 views
38

指針的大小與其指向的類型的大小相同,還是指針始終具有固定的大小?例如...指針的大小是多少?

int x = 10; 
int * xPtr = &x; 
char y = 'a'; 
char * yPtr = &y; 

std::cout << sizeof(x) << "\n"; 
std::cout << sizeof(xPtr) << "\n"; 
std::cout << sizeof(y) << "\n"; 
std::cout << sizeof(yPtr) << "\n"; 

這會產生什麼結果? sizeof(xPtr)會返回4,sizeof(yPtr)返回1,還是2個指針實際返回相同的大小?我問這個的原因是因爲這些指針正在存儲一個內存地址而不是它們各自存儲地址的值。

回答

55

指針通常有一個固定的大小,例如。在32位可執行文件中,它們通常是32位的。有一些例外,比如在舊的16位窗口中,當你必須區分32位指針和16位時......假設它們將在現代桌面操作系統的給定可執行文件中保持一致是很安全的。

編輯:即使如此,我強烈建議不要在您的代碼中作出的假設。如果你要寫一些絕對必須有一定大小的指針,最好檢查一下!

函數指針是一個不同的故事 - 有關更多信息,請參見Jens' answer

+5

不正確的,甚至在同一臺機器上的指針大小可以不同 – 4pie0

+2

@ CF16就可以了,但我的答案只有斷言,現代桌面操作系統的,即Win32的/ 64,Linux的......你能不能給我在這些系統中有一個不同的例子呢? –

+0

你自己提到了一些例外情況,例如,但是確定 – 4pie0

10

在32位機器上sizeof指針是32位(4字節),而在64位機器上是8字節。無論它們指向哪種數據類型,它們都具有固定的大小。

+1

有什麼不對?問題被要求提供數據類型指針... – peeyush

+1

64位機器上的32位可執行文件怎麼樣? – Ident

0

指針的大小是由系統保留唯一的內存地址(因爲指針只是擁有它指向的地址)

+0

除了在單詞尋址機器上指向字符之類的東西時。 –

54

函數指針可以有非常不同大小,從4所要求的尺寸到X86機器上的20字節,取決於編譯器。所以答案是否定的 - 大小可以變化。

另一個例子:取一個8051程序,它有三個內存範圍,因此有三種不同的指針大小,從8位,16位,24位,取決於目標所在的位置,即使目標的大小始終相同(如char)。

+2

謝謝,我甚至沒有考慮考慮funtion指針。 – MGZero

+1

這僅適用於您正在查看組件的情況。在C++中,不同大小的視圖是隱藏的。 – Jay

+2

@Jay:一點都不真實。 'sizeof(p)'可以爲不同類型的指針提供不同的結果。 – Nemo

6

要回答你的其他問題。指針的大小和它指向的大小不相關。一個很好的比喻是把它們看作郵政地址。房屋地址的大小與房屋大小無關。

+1

但是郵政編碼在不同地區可能有不同的大小,請參閱[是否所有數據指針的大小相同](http://stackoverflow.com/questions/1241205/are-all-data-pointers-of-the-same -size功能於一身的平臺)。有一些關係,指向不同類型的指針可以有不同的大小。 –

+1

如果你看看CPU有不同種類的尋址方法(取決於處理器)。最小的編碼地址相對於指令的位置而不是給出絕對地址。有些與CPU寄存器有關。它們比第一種類型稍大(如果你包含寄存器)。最大的有一個絕對的地址。這些通常是最大的,因爲它們需要足夠的位來編碼整個處理器地址空間。 C和C++隱藏了你的這些細節。你使用絕對地址,編譯器決定如何得到你想要的。 – Jay

2

它們可以在概念在可尋址的機器上(例如,Cray PVP系統)是不同的。

今天的大多數計算機都是字節尋址機器,其中每個地址指的是一個字節的內存。在那裏,所有的數據指針通常是相同的大小,即機器地址的大小。

在單詞可尋址的機器上,每個機器地址指的是大於一個字節的單詞。在這些內存中,指向內存字節的(char *)或(void *)指針必須包含字地址加上字節偏移量。

http://docs.cray.com/books/004-2179-001/html-004-2179-001/rvc5mrwh.html