2016-05-22 14 views
1
#include <stdio.h> 
int main() 
{ 
int i; 
i=0; 
printf("%d\n%d\n%d\n", i, &i, &(&i)); 
return 0; 
} 

私は(私は&)& iはアドレスの値だけであり、それはとても& 0xFFのだと仮定していることだと思うが0xFFでのアドレスでなければなりませんが、なぜそれが有効ではありませんか?なぜCで&(&i)が有効でないのですか?

+6

0xFFのアドレスは何ですか? –

+0

..MouinhoがMan Uを引き継ぐのには意味がないため、 –

+0

は0xFFも定数なので、定数 '0xFF'のアドレスを参照する定数があるはずです。 –

答えて

7

単項演算子&演算子は、そのオペランドとして左辺値を必要とし、右辺値を返します。 &iは右辺値なので、&iは、&のオペランドにはなりません。

+1

不思議なl/rvalues :http://stackoverflow.com/a/14752192/694576 – alk

+0

変数のアドレスは定数と見なされますか? – ameyCU

+0

@ameyCU;はい、そうです。 – haccks

2

6.5.3.2。単項&演算子のオペランドは機能指示、 []または単項*演算子の結果、またはビットフィールドでないオブジェクトを指定して ない左辺値のいずれかでなければならない

  1. register storage-class指定子で宣言します。

&iは、オブジェクトのアドレスです。

これは、アドレスは、オブジェクトまたは関数を指定しないように単項&は、&iでは使用できないことを意味し、また[]又は*演算子の結果です。

あなたの例は効果的です:&0、定数0は明らかに上記のリストに該当しません。

1

アドレスとポインタを混同しないでください。アドレスはrvalueです。「アドレス」(&)演算子をそれに適用することはできません。ポインタはオブジェクトです。これは左辺値であり、オペランド'&'です。

0

簡単に、このように見てください。あなたはハチの巣を持っています。四角で私は蜂蜜を入れました。 &演算子を使用すると、その四角形を参照できます。再び&演算子を使用すると、正方形がある正方形を参照することができます。

もっと正確には& iはメモリの場所を指します。メモリ位置のメモリ位置を参照することはできません。

関連する問題