2017-08-10 15 views
-3

ポインタがaの場合、a&aの違いを理解しようとしています。次のコード例では a、&a、* aの違いは何ですか?

int main() 
{ 
    int b = 100; 
    int *a; 
    a = &b; 
    printf("%d %d %d", a , &a , *a); 
    return 0; 
} 

は、私の理解によると、のアドレスに与えられた名前です。それは次のとおりです。aがポインタであるとき

enter image description here

は、したがって、私は同じになるようにa&aを期待しています。しかし、出力では、私は最初の2つの値(a&a)を別として取得しています。

どこが間違っていますか?

+1

*私の理解によれば、「a」は「a」のアドレスに付けられた名前です。*これは誤解です。 'a'は特定のアドレスにある値を表す名前です。だから、 'a'を使って値にアクセスします。 '&a'を使って、' a'で表される値のアドレスにアクセスします。そして、 '* a'はそれ自身がアドレスであると仮定し、' * a'はそのアドレスの値を参照します。 – lurker

答えて

5

まず、%pを使用し、ポインタを出力するために引数をvoid *にキャストします。変換仕様に互換性のない(不一致)タイプの引数を渡すと、undefined behaviorになります。

ポインタ変数であっても変数であり、アドレスに「格納」されていなければなりません。ポインタ型変数のアドレスです。すなわち

  • bは(タイプintの)変数であり、それはアドレスを有しています。
  • aは(タイプint *の)変数であり、でもにはアドレスがあります。

C11を引用し、章§6.5.3.2をいくつかの参照を追加する、

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

と、§6.3.2.1から、

左辺値は、潜在的に オブジェクトを指定(void以外のオブジェクトタイプ)の発現です。 [...]

+0

上の図では、* a = 100、&a = 0x77e4、a = 0x867fです。あれは正しいですか ? –

+0

@SeverusTux正確には、はい。 –

1

そのおそらくより簡単に次の簡単なコード例により説明:

のprintf( "%D%D%D%D%D"、&、*、& B 、b)。

例えば返す

290289632 290289644 100 290289644 100 
  • のアドレス:&は、起動時に割り当てられたもの(出力項目 1)です。
  • aはbのアドレスを指し、出力項目2と4は と同じです。
  • アドレス* a = bの値:したがって出力項目3と5は と同じです。
+0

プログラム起動フェーズで作成されたすべての変数には、異なるアドレススペースが割り当てられている必要があります。したがって、aとbのアドレスは異なる必要があります。 –

関連する問題