2012-07-01 65 views
7

我不明白這個程序的輸出:地址:(數量)

int arr[]={1,7,4,2,5,8}; 
int x=(&(arr[arr[1]-arr[4]])-arr); 
printf("%d" ,x); 

arr[arr[1]-arr[4]]等於4。這是什麼意思&(4)?爲什麼打印2?

回答

13
arr[1] - arr[4] 

這就像它看起來一樣。 7 - 5 = 2,讓我們替換成2

arr[2] 

這也只是因爲它看起來。 4&取其地址,這將是從陣列開始的兩個int s偏移量,即arr

&(arr[2]) - arr 

減去arr,所以留給你的arr[2]偏移從arr,這是兩個int秒。你走了。

Here's a reduced example.


如果你期待它是8,好,這是指針運算是多麼的。他們都投射到unsigned int

(unsigned int)&arr[2] - (unsigned int)arr 

將產生8,至少當int是四個字節。 (Demo)

5

請看minitech的答案,以顯示「2」打印值的推導方式。

但是,我認爲在你的情況下,你只是誤解了&運營商如何工作。是的,arr[arr[1]-arr[4]]4,但這並不意味着&(arr[arr[1]-arr[4]])正在做&4;它正在做&(arr[2]);它的地址爲arr[2],而不是arr[2]的值,即4