私はこのプログラムの出力を理解していない:住所:&(数)
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を印刷するのですか?
私はこのプログラムの出力を理解していない:住所:&(数)
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を印刷するのですか?
arr[1] - arr[4]
これはまるでそれと同じです。 7 - 5 = 2
、それでは2
とそのに代わっ:また、それは見た目だけのようだ
arr[2]
を。 4
。 &
のアドレスはで、配列の先頭からのオフセットはarr
です。あなたが2 int
秒でarr
、からarr[2]
のオフセットが残っているので、arr
を減算
&(arr[2]) - arr
。そこに行く。あなたはそれが8
であることを期待していた場合には
、まあ、それは、ポインタ演算があるだけの方法です。 unsigned int
にそれらの両方をキャスト:int
は4バイトで、少なくともとき
(unsigned int)&arr[2] - (unsigned int)arr
は、8
を得られます。 (Demo)
"2"の印刷値がどのように推測できるかを示すminitechの答えを見てください。
しかし、あなたのケースでは、あなたはちょうど&
オペレータの仕組みを誤解していると思います。はい、arr[arr[1]-arr[4]]
は4
ですが、それは&(arr[arr[1]-arr[4]])
が&4
を実行していることを意味するものではありません。それはやっている&(arr[2])
;アドレスがarr[2]
で、arr[2]
の値ではなく、4
です。