2015-06-09 43 views
1

我剛剛注意到我可以在指針上使用[],它可以工作,但我想知道,如果這是很好的使用它。C++,在指針上使用[]符號?

int a[]={1,2,3,4}; 
int *p=&a[1]; 
std::cout << p[0]; // returns 2; 
std::cout << p[-1]; // returns 1; 
std::cout << p[1]; // returns 3; 

我總是瞭解到,你必須使用這樣的:

std::cout << *(p-1); 
std::cout << *(p+1); 

但它是好使用操作上的[]的指針?

+1

是的,它的優良使用,非常普遍。 –

回答

4

在C/C++中,給定指針p和整數值k,p[k]被評估爲*(p+k)。只要p+k指向有效內存,任何一種形式都可以使用。

如果您有權訪問C99標準,請參見部分6.5.2.1數組下標,第2段。它說:

一個後綴表達式後跟一個表達式放在方括號內[]是一個數組對象元素的下標。下標運算符[]的定義是E1[E2](*((E1)+(E2)))相同。因爲適用於該二進制運算符+,如果E1是一個數組對象(等同於一個指針數組對象的 初始元件)和E2是一個整數的轉換規則的,E1[E2]指定的E1E2個元素(從零開始計數)。

如果您有機會獲得C++ 11標準,參見5.2.1 下標,第1款。它說:

後綴表達式,隨後在方括號中的表達式是一個後綴表達式。其中一個表達式的類型應該是「指向T的指針」,另一個表達式應該是非範型的枚舉或整型。 結果是「T」類型的左值。「T」類型應該是完全定義的對象類型。表達E1[E2]是(根據定義)相同*((E1)+(E2))

+0

好的,謝謝,馬上沒有找到信息,在等待期間之後會選擇這個答案爲正確的;) – Bosiwow

2

除了極大答案由R薩胡還可以做

std::cout << p[-1]; // returns 1; 
std::cout << p[1]; // returns 3; 

std::cout << 1[p]; // returns 3; 
std::cout << (-1)[p]; // returns 1; 

參見:Ideone

對於指針p和整數值k

p[k] and k[p] both are evaluate至*(p+k)。所以,兩者都是一樣的。

但下面一個不一樣

std::cout << -1[p]; // returns -3; 
std::cout << (-1)[p]; // returns 1;