私はメモリがコンパイラによってマッピングされているどのように説明してみましょう:
はのは、より実用的な例の多次元配列について考えてみましょう:あなたはコマンドを実行することができます
int a[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
を
x/10w a
GDBで
とメモリを見て:
0x7fffffffe750: 1 2 3 4
0x7fffffffe760: 5 6 7 8
0x7fffffffe770: 9 0
各要素はタイプ(32ビット/ 4バイト)に格納されています。 Soは行列の最初の要素は、に格納されている:
1) a[0][0] -> 0x7fffffffe750
2) a[0][1] -> 0x7fffffffe754
3) a[0][2] -> 0x7fffffffe758
4) a[1][0] -> 0x7fffffffe75c
5) a[1][1] -> 0x7fffffffe760
6) a[1][2] -> 0x7fffffffe764
7) a[2][0] -> 0x7fffffffe768
...
コマンド:それが原因 ポインタaritmeticのアドレス0x7fffffffe768を印刷する
std::cout << a + 2 << '\n'
:の タイプはint **なので、ポインタへのポインタです。 a + 2はa [0](第1行)+ 2である。結果は第3行へのポインタ である。
*(A + 2)が第三の行をdeferences、すなわち{7,8,9}
だ第3段目は、それがintへのポインタだ、intの配列です。
オペレータ< <は、そのポインタの値を出力します。
そのようなことを信じるならば、偶然かもしれません... –
印刷されたポインタの値が同じであっても、タイプはありません。 – Jarod42
あなたは運がいいです!今日、そして今日だけ、stackoverflow.comで私たちは特別なことをしています:あなた自身の質問に答えてください!小さな配列を作成して、 'int a [2] [2]'と言う。それに4つの値、例えば1、2、3、4を入れます。最初の要素 'int * p =&a [0] [0];'へのポインタを取得します。次に、デバッガで、 'p'が指しているものを見て、あなた自身の質問に答えます。どのようなバーゲン! –