когда у тебя именованная переменная, она хранится на стеке. И p в main копирует значение из стека. когда у тебя не именованная переменная, её зачение при return p копируется на стек, а что происходит после return с ней, на стек уже не влияет. p в main опять получает значение из стека
В вашем случае получается 2 переменные. Одна с которой работает и вторая которая возвращается. И вот с дефером вы вклиниваетесь в то место, где ваша переменная уже скопированая в переменные возврата, а меняете вы переменную, кторая уже нигде не используется.