имею ввиду, зачем делают так *p+1 для доступа к следующиму элементу, а не p[1]?
Вообще то ничего общего между приведенными операциями нет (смотрите приоритет операций):
*p+1 == (*p) + 1
p[1] == *(p+1)
Но вопрос в целом понятен, не взирая на ошибку в примере.
Надо смотреть на контекст. Часто бывает, что код не ограничивается одноразовым применением p[1], а например есть целая серия обращений к p[1], в этом случае будет экономия на операциях, если вы сначала вычислите адрес p[1], а в дальнейшем будете использовать простое разыменование этого адреса. Будет ли реально выигрыш во времени исполнения зависит от компилятора, в целом думаю, современные компиляторы в состоянии сами сделать подобную оптимизацию.