2017-06-03 52 views
1

This question被要求在最近的考試,考生必須找到下列代碼的輸出:這種訪問C字符串中字符的方式是如何工作的?

#include<stdio.h> 
#include<string.h> 
int main() 
{ 
    char * c = "GATECSIT2017"; 
    char *p = c; 
    printf("%d", (int)strlen(c+2[p]-6[p]-1)); 
    return 0; 
} 

我開始在C++編碼,所以我不是在C-字符串的專家。在弄亂了代碼之後,我明白它是如何工作的,但有一點我不清楚,就是這種從char *字符串中訪問char的方式。

我的問題是,2[p]如何獲取索引2處的字符? 它是否解析爲*(p+2)還是有其他事情?另外,是否有任何文檔或任何文章可以解釋這種行爲?

回答

5

對於任何陣列或指針a和索引i,表達式a[i]等於*(a + i)

由於+commutative property表達*(a + i)的是等於*(i + a),根據第一平等等於i[a],即切換地點索引和指針/陣列。

因此,在您的情況下,表達式2[p]等於*(2 + p),其等於*(p + 2),其等於p[2]

使用例如2[p]只適用於(壞)混淆,所以請不要在任何地方使用它。

+0

你說得很清楚。如何解決索引並且+運算符的交換屬性導致2 [p]與p [2]相同。 – RishbhSharma

+0

你能指出一些資源來說明[]的行爲嗎?或者與這個問題有關的其他資源? – RishbhSharma

+1

@RishbhSharma [這是關於數組下標運算符的參考](http://en.cppreference.com/w/c/language/operator_member_access#Subscript)。 –