petit rappel toujours utile :
&var : où est ma variable ?
*pointeur : qu'y a-t-il en mémoire à la case " pointeur " ?
autement dit : *&var = qu'y a t il en mémoire à l'adresse de "var" ? -> hé bien, .... var .
quant au (*p).pa, il mérite quelques explications.
p est un pointeur vers ta structure.
quand tu écris *p, tu manipules ce vers quoi pointe p, à savoir la structure elle même.
Ce qui devrait te permettre d'écrire *p.membre; mais l'opérateur . a une priorité supérieure à *, dont le compilo lui il comprend :
*(p.membre), ce qui ICI ne veut rien dire (voir note * )
Du coup tu mets des parenthèses pour lui dire ce que tu veux faire.
comme c'est chiant à écrire, le C définit un autre opérateur.
p->membre est SRTICTEMENT equivalent à (*p).membre.
c'est juste, tu t'en rendras compte avec l'habitude, beaucoup plus clair est facile à utiliser.
En gros '->' remplace '.' quand le membre de gauche est un pointeur et non directement une structure.
* : ça aurait un sens si p était une structure genre ma_struct p ( et non ma_struct * p_ptr ) et membre un pointeur ( genre int * membre ). Tu aurais donc la variable pointée par membre, lui même membre de p.
C'est plus clair ? j'ai un doute

_______________________
Omnia vincit labor improbus