2017-01-28 83 views
4

我試圖理解爲什麼下面的C++代碼不編譯增量指針數組

int main() { 
    int a[10]; 
    int (*p)[10] = &a; 
    int *q = static_cast<int *>(++p); 
} 

如果不是很明顯,我試圖做的是找到一個指向數組的結尾通過使用指針算術。

我的理解到目前爲止,p有十個整數數組的指針類型,表達式++p也有。通常,我可以將一個int數組賦給一個指向int的類型指針變量,但是這個失敗在增加的指針++p上。

我第一次嘗試沒有static_cast但也沒有工作。

+0

你可以做' p'一個'int *':'int * p = a; int * q = ++ p;' –

+0

@GregKikola是的,我可以這樣做,但那不是我想要做的。我認爲這兩種情況下的指針算術應該是不同的。 –

+2

哦,我誤解了,我沒有看到關於想讓'q'指向數組結尾的提示。在這種情況下,你可以做'int * q = a + 10;'。或者,在C++ 11中,'int * q = std :: end(a);'(只包含'')。 –

回答

7

p有類型指針的10個整數

這是正確的數組。

通常,我可以分配整數數組到指針類型 的變量爲int

這也是正確的。除了,如果你比較你的兩條語句,你應該看到明顯的區別:p不是一個int數組,它是一個指向int數組的指針。因此,差異。現在

,如果取消引用該指針數組,你的結果將是其類型是一個數組(非嚴格意義上)的表達式,可以衰減到指針:

int *q = static_cast<int *>(*++p); 
+0

謝謝,這是有道理的。 –

+0

奇怪的是,如果我打印'p'和'q',我會得到同樣的結果。所以在指向數組的指針運算上似乎有些奇怪。 –

+0

@SidiousLord'p'和'q'是不同的類型,但它們擁有相同的地址,它們都指向數組結束後的元素。 'p'指向從該地址開始的10個int的數組,'q'指向在相同地址的int。 –