2012-07-01 20 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&のアドレスはで、配列の先頭からのオフセットはarrです。あなたが2 int秒でarr、からarr[2]のオフセットが残っているので、arrを減算

&(arr[2]) - arr 

。そこに行く。あなたはそれが8であることを期待していた場合には

Here's a reduced example.


、まあ、それは、ポインタ演算があるだけの方法です。 unsigned intにそれらの両方をキャスト:intは4バイトで、少なくともとき

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

は、8を得られます。 (Demo)

5

"2"の印刷値がどのように推測できるかを示すminitechの答えを見てください。

しかし、あなたのケースでは、あなたはちょうど&オペレータの仕組みを誤解していると思います。はい、arr[arr[1]-arr[4]]4ですが、それは&(arr[arr[1]-arr[4]])&4を実行していることを意味するものではありません。それはやっている&(arr[2]);アドレスがarr[2]で、arr[2]の値ではなく、4です。