2014-03-04 90 views
3

我編寫了下面的程序來理解指針運算。第二個輸出看起來很奇怪,因爲指針'cp'被聲明爲const char **。如果沒有任何投射,我認爲當我做(cp + 1)而不是'8'時,它會增加'1',如輸出所示。指針運算的奇怪結果

#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 

回答

4

在沒有任何鑄造我期望[const char **]通過當我做(CP + 1)「1」,而不是「8」作爲輸出顯示遞增。

否 - 指針的指針將由指針的大小,你的系統上是8

3

沒有任何造型我預計它會在「1」遞增,當我做(CP + 1),而不是「8」作爲輸出顯示。

您可能會認爲,但你會錯的。當增加一個指針時,增量的大小就是指針所指向的東西的大小,在這種情況下,這是8個字節(指針的大小)。

如果您想了一會兒,那比增加1個字節更有意義。如果你有一個指向數組的指針,無論這些指針是整數還是其他指針或結構,通過添加n可以獲得數組中的n+1th項目是有用的。如果指針始終增加1個字節,則必須改寫如下內容:p += (n * sizeof(MyStructType));。這樣做在大多數情況下更難閱讀,也更容易出錯。另一方面,將指針指向結構的指針增加1個字節沒有多大好處 - 這是導致錯位錯誤的肯定方法。

+0

我對你的回答的第一部分,第二部分是模糊和不明確的同意遞增。 – liv2hak