2013-03-21 85 views
2
int i=0; 
int *p = &i; 
std::cout<<sizeof(i)<<" vs "<<sizeof(p)<<"\n"; 

char c='0'; 
char*pc = &c; 
std::cout<<sizeof(c)<<" vs "<<sizeof(pc)<<"\n"; 

double d=0.123456789; 
double *pd = &d; 
std::cout<<sizeof(d)<<" vs "<<sizeof(pd)<<"\n"; 

爲什麼指針的大小始終等於4的整數?指針的大小

+0

在64位上嘗試它,你會發現它是不同的。 :) – Mysticial 2013-03-21 02:05:43

+1

這是一個奇怪的問題;你知道指針是什麼嗎?爲什麼你會期望它有不同的大小? – tenfour 2013-03-21 02:07:21

+0

C++社區只是一個簡單的問題,但我在短時間內收到很多回復。高興!謝謝。 – 2013-03-21 02:13:06

回答

1

因爲這是指針需要多少內存:4個字節。

如果這是一個64位應用程序,它會返回8.

6

指針不包含它們指向的數據。

指針只是指向他們指向的數據。

sizeof(double*)是用於描述double所在位置的數據大小。就像一張紙上有房屋地址的紙張,如果房屋更大或更小,其大小不變,指針的大小不是指向數據大小的函數。

嗯,通常。你可以想象國際地址更長,並且需要更多的紙張。同樣,您可以想象公寓內的地址與其他地址相比需要額外的「單元號」,或者甚至「公寓內」地址只包含包含「單元號」,因此更短。該標準允許各種指針的大小不同,而某些體系結構(最着名的8086)具有近指針和遠指針(分別爲16位和32位)的概念。

這是不常見了(也許除了成員函數指針的,但如何常見的是那些?)

+0

愛你提到的尋址示例! – Ajay 2013-03-23 07:27:29

1

取決於你編譯應用類型的指針的大小。

指針就像是在32位應用程序中的32-bit unsigned int,因爲它存儲內存位置。

如果應用程序是N-bit應用程序,任何指針的大小將是N bits長,因爲它需要足夠大以存儲內存位置。

任何N-bit可以運行的計算機N-bit應用程序的RAM限制爲2^N bytes。這使得最大的內存位置ID等於2^N - 1(因爲0x00000000是有效的內存地址)。

2^N - 1要求N bits以二進制表示,並且我的朋友是爲什麼指針在32位應用程序中的大小爲4個字節的原因。

就拿爲了簡單起見,3-bit應用爲例:(我寧願不處理大量)

讓我們假設這是一個3-bit機器上運行。由於2^3 - 1是可用3 bits以二進制表示的最大數字,因此係統可以處理的最大內存將爲2^3字節。 (這些是未簽名的。負內存地址不存在)

可能的內存地址是:

  • 0x0(二進制表示:000
  • 0x1(二進制表示:001
  • 0x2(二進制表示: 010
  • 0x3(Binary representation:011
  • 0x4(二進制表示法:100
  • 0x5(二進制表示法:101
  • 0x6(二進制表示法:110
  • 0x7(二進制表示法:111

因此,指針指向一個內存地址在這種情況下需要有3 bits

3替換爲32這將適用於您在此處所做的事情。

(矯枉過正的回答多少?是的。爲什麼呢?因爲我很無聊。)

+0

並非總是如此。但大部分時間都是如此。當然不是標準要求的。例如,它可能包含某些體系結構上的段偏移量,該偏移量可能小於物理機器的地址空間。 – 2013-03-21 02:19:24

+0

當然,但我不認爲有人會想要處理這種特殊情況:p(好東西沒有/理智/程序員必須) – 2013-03-21 02:21:29

+0

沒錯,沒有人想要處理特殊情況。但在某些情況下,需要特殊情況才能正確理解。 C和C++在指針上放置了要求「類似地址」的指針 - 但是並沒有強制指針存儲的數據與底層機器的物理內存尋址模型之間的任何關係。 – 2013-03-21 02:23:13

2

指針實際上是包含地址的變量。在32位機器上,地址總是32位,所以它是4個字節。用於16位或64位機器的相同邏輯。

只是看着到C99標準,它說:

指針的大小不一定與任何 整數類型的大小。一個實現可能支持指針的多個大小的 指針。

那麼,我認爲知道指針大小最安全的方法是sizeof()

+0

它可能不包含地址。例如,在某些體系結構中,它將包含段偏移量。 – 2013-03-21 02:20:12

+0

好吧,謝謝你指出,你提到遠點? – 2013-03-21 02:30:00

+1

在某些體系結構中,可能會有近/遠指針的概念,是的。但這不是標準討論的內容。該標準對指針的要求是強制它們以類似於內存地址的方式操作。但決不要求存儲在指針中的值與目標機器上的物理存儲位置之間存在任何關係。 – 2013-03-21 02:34:08