void * ptr1;
significa che ptr1
è una variabile il cui tipo è void *
. Questo tipo indica un "puntatore generico": punta a qualche posizione di memoria ma non contiene informazioni sul tipo cosa è in quella posizione.
void * volatile ptr2;
significa che la variabile ptr2
è anche un puntatore generico, ma è anche volatile
. La parola chiave volatile
è denominata qualificatore e ha le stesse regole grammaticali di const
.
Il significato di una variabile volatile è che quando un altro codice dice ptr2
, il compilatore non può ottimizzarlo; deve leggere o scrivere la posizione di memoria in cui è memorizzato ptr2
; deve consentire la possibilità che qualche processo esterno stia anche leggendo o scrivendo quella posizione.
Infine, void * volatile *x
è qualcosa che può indicare ptr2
. Ad esempio potremmo avere void * volatile * x = &ptr2;
.Se quindi scriviamo *x = NULL;
ad esempio, allora ha il tipo void * volatile
che ha le stesse implicazioni che abbiamo appena visto per ptr2
.
Il compilatore si lamenterebbe se ha omesso il qualificatore, ad es. void * *y = &ptr2;
. Questo perché l'espressione *y
avrebbe quindi il tipo void *
(non volatile), quindi il compilatore potrebbe eseguire ottimizzazioni intorno a esso, tuttavia questo comportamento non è corretto perché ptr2
non consente tali ottimizzazioni. (Si può riconoscere che "volatilità-correttezza" è lo stesso tipo di cosa come la costituttezza).
fonte
2014-11-28 05:25:41
che sembra valido, ma non sono sicuro come leggerlo, così che è il motivo per cui ho chiesto. –
La mia ipotesi per il downvote sarebbe che qualcuno leggesse solo il titolo della domanda e pensava che fosse una domanda senza ricerca su cosa significhi "vuoto" o "volatile" isolatamente. –
@vsoftco sicuramente è piuttosto una sopravvalutazione (tra le persone che seguono comunque il tag C++) - 'volatile' è comunemente noto e lo è anche il significato delle dichiarazioni dei puntatori semplici, quindi anche se questa combinazione specifica non fosse stata vista prima che possa essere elaborato –