このプログラムの出力がわかりません:
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. は&そのアドレスを取得します。intこれは、配列の先頭から 2 秒のオフセットである ですarr。
&(arr[2]) - arr
それは を引くので、 fromarrのオフセットが残ります。これは 2です。ほらね。arr[2]arrint
であると予想していた場合は8、まあ、それがポインター演算のやり方です。unsigned int両方を次のようにキャストします。
(unsigned int)&arr[2] - (unsigned int)arr
8少なくとも anintが 4 バイトの場合、が生成されます。(デモ)
「2」の印刷値をどのように推定できるかを示すミニテックの回答を見てください。
ただし、あなたの場合、&オペレーターの仕組みを誤解していると思います。はい、そうarr[arr[1]-arr[4]]ですが、それはそれがやっている4という意味ではありません。やっています; の値ではなく、のアドレスを取得しています。&(arr[arr[1]-arr[4]])&4&(arr[2])arr[2]arr[2]4