Что происходит с этим кодом?
int n = *w++;
*w++ работает так же, как *(w++) .
Сначала происходит инкремент указателя, операция пост-инкремента возвращает значение операнда до инкремента, а затем это значение разыменовывается и результат присваивается переменной n.
После этого в n находится 5, а указатель w указывает за край массива.
а кто сказал что &arr[2] == arr[2]??
&arr[2] - это pinter, а arr[2] это int 
PS: GCC ругается на это "warning: comparison between pointer and integer"int i = 5;
int n = i++; сначала n станет равно i (5), затем i будет увеличен на 1
если ++i, то сначала i будет увеличен, а потом n будет равен результату.