Innanzitutto, l'operatore * ha la precedenza sull'operatore ++ e gli operatori() hanno la precedenza su tutto il resto. MODIFICA (le cose sono più complicate di così, vedi modifica in basso)
In secondo luogo, l'operatore di numero ++ è uguale all'operatore numero ++ se non le si assegna a nulla. La differenza è numero ++ restituisce il numero e quindi incrementa il numero, e il numero ++ incrementa per primo e poi lo restituisce.
In terzo luogo, aumentando il valore di un puntatore, lo si incrementa in base alla dimensione del suo contenuto, ovvero lo si incrementa come se si stesse iterando in un array.
Quindi, per riassumere il tutto:
ptr++; // Pointer moves to the next int position (as if it was an array)
++ptr; // Pointer moves to the next int position (as if it was an array)
++*ptr; // The value of ptr is incremented
++(*ptr); // The value of ptr is incremented
++*(ptr); // The value of ptr is incremented
*ptr++; // Pointer moves to the next int position (as if it was an array). But returns the old content
(*ptr)++; // The value of ptr is incremented
*(ptr)++; // Pointer moves to the next int position (as if it was an array). But returns the old content
*++ptr; // Pointer moves to the next int position, and then get's accessed, with your code, segfault
*(++ptr); // Pointer moves to the next int position, and then get's accessed, with your code, segfault
Come ci sono un sacco di casi in qui, avrei fatto qualche errore, per favore correggetemi se sbaglio.
EDIT:
così mi è stato sbagliato, la precedenza è un po 'più complicato di quello che ho scritto, vista qui: http://en.cppreference.com/w/cpp/language/operator_precedence
perché non lo esegui nel debugger? –
Beh .. perché non semplicemente * provare * e vedere? 'printf' stamperà un puntatore con% p –
Se sei curioso del comportamento, gioca solo con esso. Basta scrivere un semplice programma c che riporti tutti questi casi d'uso e vedere se ha senso per te. – Cyrus