簡體   English   中英

指針算術的奇怪結果

[英]Strange result with pointer arithmetic

我編寫了以下程序來理解指針算法。 第二個輸出看起來很奇怪,因為指針'cp'被聲明為一個const char **沒有任何一個我會希望它增加'1'當我做(cp + 1)而不是'8'因為輸出顯示。

#include <stdio.h>

typedef const char uint8_t;

const char *c = "hello";
const char **cp = &c;
const char ***cpp = &cp;
const char ****cppp = &cpp;

int main() {

        printf(" cp     %p     (cp + 1)   %p \n",(int*)cp, ((int*)cp)+1 );
        printf(" cp     %p     (cp + 1)   %p \n", cp, (cp + 1));
        printf(" cp     %p     (cp + 1)   %p \n", (uint8_t*)cp, ((uint8_t*)cp) + 1);

        return 0;
}


 cp     0x601020     (cp + 1)   0x601024 
 cp     0x601020     (cp + 1)   0x601028 
 cp     0x601020     (cp + 1)   0x601021 

如果沒有任何轉換,我會期望[ const char ** ]在輸出(cp + 1)而不是輸出顯示的'8'時增加'1'。

否 - 指向指針的指針將增加指針的大小,指針在系統上為8。

如果沒有任何強制轉換,我會在輸出(cp + 1)而不是輸出顯示的'8'時增加'1'。

你可能會想到,但你錯了。 增加指針時,增量的大小是指針指向的東西的大小,在這種情況下是8個字節(指針的大小)。

如果你考慮一下這一點,那就比增加1個字節更有意義。 如果你有一個指向一組數組的指針,無論這些是整數還是其他指針或結構,那么通過添加n來獲得數組中第n+1th項是很有用的。 如果指針總是增加1個字節,則必須編寫類似的內容: p += (n * sizeof(MyStructType)); 在大多數情況下,這樣做會更難以閱讀,也更容易出錯。 另一方面,能夠將指向結構的指針增加1個字節並沒有多大好處 - 這是導致錯位錯誤的可靠方法。

暫無
暫無

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

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