Теперь, когда вы дали нам код, мы можем ответить на ваш вопрос.
Итак, запутанная часть такова: &arr + i
. Это не делает то, что вы думаете, что делает. Помните, что &
имеет приоритет над +
. Итак, вы берете адрес arr
и перемещаете его вперед i
раз.
Арифметика указателей работает таким образом, что &x + 1
перемещает указатель вперед на size(x)
. Так в вашем случае что такое size(arr)
? Это 8, потому что это 2-элементный массив целых чисел (я предполагаю, что целые имеют размер 4). И поэтому &arr + 1
фактически перемещает указатель на 8 байтов вперед. Точная вещь, которую вы испытываете. Вы не запрашиваете следующий int, вы запрашиваете следующий массив . Я рекомендую вам поиграть, например, определите arr
как int[3]
(размером 12) и посмотрите, как указатель перемещается на 12 байтов вперед.
Итак, первое решение - сделать arr + i
без &
. Мы можем применить арифметику указателей к массиву, в этом случае он распадается на тип указателя int*
. Теперь, когда int
имеет размер 4, arr + 1
правильно указывает на сегмент памяти на 4 байта вперед.
Но я советую держаться подальше от арифметики с указателями и вместо этого делать &arr[i]
. Это делает то же самое, но IMO менее подвержен ошибкам, менее запутан и говорит нам больше о намерениях.