2011-01-23 47 views
7

在:http://www.fredosaurus.com/notes-cpp/arrayptr/26arraysaspointers.htmlC++ - 指針添加和單元尺寸

下:指針添加和單元尺寸

有下面的代碼:

// Assume sizeof(int) is 4. 
int b[100]; // b is an array of 100 ints. 
int* p;  // p is a a pointer to an int. 
p = b;  // Assigns address of first element of b. Ie, &b[0] 
p = p + 1; // Adds 4 to p (4 == 1 * sizeof(int)). Ie, &b[1] 

如何在沒有 「P」最後一行變成「4」?

謝謝。

+0

注意轉移,這是不是適當的值

轉移它總是4.這只是大多數現代32/64位系統sizeof(int)是4.但是在更奇特的平臺上它可能是任何東西,因此「假設sizeof(int)是4」評論。 – 2011-01-23 08:39:32

+0

不是真正的深奧系統。我認爲Arduino處理器的sizeof(int)是2 – Falmarri 2011-01-23 08:45:08

回答

11

(我假設你的意思是「1」,在最後一行,而不是「P」)

指針運算在C和C++是一種邏輯另外,不是數字另外。將一個指針加入指針意味着「產生一個指向該對象的指針,該對象在該指針之後」,這意味着編譯器會自動按照所指向的對象的大小自動按比例增加指針。這可以防止您將指針指向對象的中間或指針未對齊或兩者都有。

3

您發佈的代碼中的註釋說明了這一點:向指針添加整數x會將指針的值乘以指向的類型的大小x。

這很方便,因爲它通常不會以更小的增量更改指針 - 您不希望它指向其中一個元素的中間。

+0

你應該補充說,結果的「4」值只是該代碼示例中可能出現的大量隨機值之一。換句話說:包含在p指向的內存區域中的整數值簡單地...未定義。 – Frunsi 2011-01-23 09:14:40

1

因爲p是指向大小爲4字節的類型的指針。指針上的操作符實際上是指針移位。編譯器知道尖型的大小,如果你改變intshort,對將2個字節