2017-03-21 5 views
-7

上記の式は次のようになります*(&(&(&(*(*(*X)))))int x = 2; * &&& *** xは何を返しますか?

私が解決できる限り、コンパイラは(***X)の値をトレースできると思います。しかし、値のアドレスを取得しようとするとどうなりますか? &(***X)。これは使えますか?値はいくつかの乱数であるため、式です。コンパイラは値を検索してそのアドレスを返しますか?出力されない場合は何ですか?

+2

あなたは '&(&x)'することはできません。 –

答えて

4

コンパイラエラーです。 intを逆参照することはできません。

+0

説明してください。 –

3

あなたの仮定が間違っています:*&&&***x*(&(&(&(*(*(*X)))))のように分解しないであろう、それは構文エラーが生じ、*&&&***xとしてトークン化されます。あなたはアドレスのアドレスを取ることができないので、*& & &***xのようにスペースを追加する

は制約違反になり、また、あなたはポインタとしてint変数x間接参照することができます。

逆に、*&*&*&*&xは、xの値をとるためにはっきりとした方法ですが、0[&x]です。

+0

0 [&x]は何を意味しますか? –

+0

@Sarankumar: '0 [&x]'は '*(0 +&x)'と同じですので、 '*&x'や'(&x)[0] 'と同じです。配列の表記法に驚くほど正確なバリエーション。 – chqrlie

+0

@Sarankumar:あなたはスコアの下の灰色のチェックマークをクリックすることでこの回答を受け入れることができます。 – chqrlie

0

いいえ、xはint型なので問題が発生します。あなたが* xと言うとき、それは "xが指す変数の値が必要です"という意味です。あなたは2がメモリ内の有効なアドレスではないことを知っています。この原因のエラーです(割り当て可能な唯一の有効なアドレスは0です)。 xがint型であるため、intを参照解除することはできません。コンパイルエラーが発生します。

+0

私の質問は素朴ですが、なぜintを参照できないのでしょうかと申し訳ありません。 –

+0

@Saran kumarあなたはどこかを指し示すオブジェクトである参照を逆参照することしかできません。 intは指すことはありませんがintへのポインタは逆参照することができます – Holger

+0

@Saran kumarあなたはアドレス自体を含むsthしか参照できません。それはポインタです。 int型にはアドレスが含まれていません。 –

関連する問題