a[0] + 1
означает, что 1 добавляется к значению, сохраненному в a[0]
*(a + 1)
означает, что 1 * sizeof(int)
добавляется к адресу памяти a, а затем осуществляется доступ к значению в этом месте, что означает, что вы получите a[1]
Подробнее об указателях здесь .
Что касается вашего последнего вопроса, нет гарантии, что он напечатает какое-либо конкретное значение, так как два адреса памяти не должны быть смежными. Для меня это печатает -4
например.