[英]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.