Это значение объекта, на которое указывает ip, на объект после объекта, на который указывает ip. Это лучше объяснить на примере:
Давайте предположим, что ip указывает на первый int в массиве int:
[4, 5, 10, -1]
Здесь ip будет указывать на 4.
ip+1
означает, что мы хотим переместить этот указатель на одну позицию вправо (теперь это указывает на 5)
*(ip+1) and *ip
- разыменование указателя. Это означает, что мы хотим оперировать значением объекта, а не самим указателем. Так что, сказав *(ip+1) = *ip;
, вы хотите присвоить значение, на которое указывает ip, объекту, на который указывает ip + 1 (обычно следующий объект в массиве). После этого наш примерный массив будет выглядеть так:
[4, 4, 10, -1]
Обратите внимание, что для этого требуется, чтобы у вас была память, на которую указывает ip + 1. Это также работает с любым классом (не только целые)