2017-03-26 8 views
1

次のコードは実行時に '6'と出力します。配列のアドレスのアドレス

#include<stdio.h> 

int main() 
{ 
     int a[]={7,5,3,4,1,6}; 
     int *ptr=(int*)(&a+1); 
     printf("%d",*(ptr-1)); 
     return (0); 
} 

私が意味するライン部 "(+ 1 &)(int型*)" 何をするかを理解することはできません。あなたはそれを引き出す場合、理解しやすいかもしれません

+0

これは、「私は未定義の動作を恐れることはありません。コンパイルするまではキャストを投げます」という意味です。あなたがするべきことではありません。 –

答えて

0

 
+---+---+---+---+---+---+---- 
| 7 | 5 | 3 | 4 | 1 | 6 | ... 
+---+---+---+---+---+---+---- 
^     ^^
|     | | 
&a     | &a + 1 
        | | 
        | ptr 
        | 
        ptr - 1 

あなたが&a + 1から取得するポインタが配列のを超え終わりを指している、です。

知って良いですもう一つは、任意のポインタ(または配列)ptrインデックスiため、式*(ptr + i)ptr[i]に等しいということです。したがって、(*ptr - 1)を実行すると、実際にptr[-1]が実行され、6となり、その要素はptr[0]より前です。

1

aは、6intの配列である。したがって、&aは「6intの配列へのポインタ」または(C++構文の)int (*)[6]の型です。

&a + 1したがってaの端を越えてすぐにメモリ内にある6intの(存在しない)アレイのアドレスです。

(int *)(&a + 1)&a + 1の値を変換します。したがって、タイプはint *です。これにより、aの直後のメモリにある単一のintのアドレスが得られます。形式的に&a + 1(int *)(&a + 1)の値は同じですが、タイプが異なります。

ptr - 1したがってaの最後のエレメントのアドレスを与え、従って*(ptr - 1)を印刷する(aの最後の要素の値である)値6を与えます。

+0

しかし、 'a'自体がポインタ/アドレスではありませんか?そうであれば、ポインタのアドレスはどういう意味ですか? – Eru

+0

いいえ、 'a'は配列です。ポインタはアドレスを含む変数です。 "Xの配列"と "Xへのポインタ"(ここでXは型です)では同じ結果が得られますが、 "配列はポインタです"という意味ではなく、ポインタは配列です "。 – Peter

関連する問題