Jon McKee
Причиной такого вывода является то, что называется арифметикой указателей. Массивы хранятся последовательно в памяти. Таким образом, смещение от одного значения к другому-это размер типа. Integer = 4 байта, float = 4 байта, double = 8 байт и т. д. Это фундаментальная причина, по которой работает арифметика указателей. Когда вы говорите a[2], то на самом деле вы говорите: "указатель на начало массива (то есть первый элемент) плюс два смещения на сумму целых чисел, чтобы достичь третьего значения." Вы можете проверить это, выполнив "*(a+2)", что даст тот же результат, что и A[2].
Итак, что происходит в коде, который вы опубликовали: адрес (&) a[2] присваивается b. Затем вы печатаете в стандартный выходной поток значение 3 смещений, равное целым числам (b[3]). Это 5.
b[0] = a[2]
b[1] = a[3]
b[2] = a[4]
b[3] = a[5]