簡體   English   中英

指針在C ++中遞增

[英]Pointer incrementing in C++

這是什么意思:指針增量指向指針的下一個基本類型的地址?
例如:

p1++;  // p1 is a pointer to an int

此語句是否意味着p1指向的地址應更改為下一個int的地址,或者它應該僅增加2(假設int是2個字節),在這種情況下,特定地址可能不包含int
我的意思是,如果p1是,例如,0x442012, p1++將是0x442014(可能是double的地址的一部分)還是指向下一個int ,它位於像0x44201F這樣的地址中?

謝謝

指針算術不關心指針對象的內容或有效性。 它將使用以下公式簡單地遞增指針地址:

new_value = reinterpret_cast<char*>(p) + sizeof(*p);

(假設指向非const的指針 - 否則強制轉換不起作用。)

也就是說,無論像指針值和內存對齊如何,它都會將指針增加一個sizeof(*p)字節。

編譯器會將sizeof(int) (通常為4)添加到指針的數值。 如果p1在遞增之前是0x442012,那么在遞增之后它將是0x442012 + 4 = 0x442016。

請注意,0x442012不是4的倍數,所以它不太可能是有效的4字節int的地址,盡管它對於你的雙字節整數是合適的。

它肯定不會去尋找下一個整數。 這需要魔法。

p1 ++產生匯編語言指令,它將p1增加指向它的大小。 所以你得到了

(char *)p1 = (char *)p1 + sizeof (object pointed to by p1)

(當回答這個問題時)通常一個int是4個字節,所以它會增加4,但它取決於你機器上的sizeof()。

不會去“未來INT”。

例如:假設一個4字節地址,p1 = 0x20424(其中p1是一個int *)。 然后

p1++

將p1的新值設置為0x20428。 不是0x20425。

如果p1指向int類型的對象數組的索引n的元素(為此目的,非數組對象計為長度為1的數組),那么在p1++p1是:

  • 指向索引的元素n+1 ,如果數組長度大於的n+1
  • 數組的'past-the-end'地址,如果數組的長度恰好為n+1

如果p1未指向int類型的對象數組的元素,則p1++會導致未定義的行為。

C和C ++語言賦予“地址”概念的唯一含義是指針對象的值。

C / C ++的地址概念與匯編語言中考慮的數字地址概念的關系純粹是一個實現細節(盡管是一個非常常見的實現細節)。

指針算術在sizoeof(*pointer)倍數中完成 - 也就是說,對於指向int的指針,increment將前進到下一個整數(或32位整數的4個字節)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM