このプログラムの出力がわかりません:
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]
arr
int
であると予想していた場合は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