void * ptr1;
bedeutet, dass ptr1
ist eine Variable, deren Typ void *
. Dieser Typ gibt einen "generischen Zeiger" an - er zeigt auf einen Speicherort, enthält aber keine Typinformationen, was sich an diesem Speicherort befindet.
void * volatile ptr2;
bedeutet, dass die variable ptr2
auch ein generischer Zeiger ist, sondern ist auch ptr2
volatile
. Das Schlüsselwort volatile
ist ein cv-Qualifier genannt, und es hat die gleichen Grammatikregeln wie const
.
Die Bedeutung eines flüchtigen Variable ist, dass, wenn ein anderer Code ptr2
sagt, kann der Compiler nicht optimieren heraus; er muss den Speicherort lesen oder schreiben, in dem ptr2
gespeichert ist; es muss die Möglichkeit zulassen, dass ein externer Prozess diesen Ort liest oder schreibt.
Schließlich ist void * volatile *x
etwas, das auf ptr2
zeigen kann. Zum Beispiel könnten wir void * volatile * x = &ptr2;
haben.Wenn wir dann beispielsweise *x = NULL;
schreiben, dann hat *x
den Typ void * volatile
, was die gleichen Auswirkungen hat, wie wir sie für ptr2
betrachtet haben.
Der Compiler würde sich beschweren, wenn Sie den Qualifier, z. void * *y = &ptr2;
. Dies liegt daran, dass der Ausdruck *y
dann den Typ void *
(nicht-flüchtig) hätte, so dass der Compiler Optimierungen durchführen könnte, dies ist jedoch ein inkorrektes Verhalten, da ptr2
diese Optimierungen nicht zulässt. (Sie können erkennen, dass "volatile-correctness" die gleiche Art von const-correctness ist).
Das gültig scheint, aber ich bin nicht sicher, wie es zu lesen, so dass Deshalb fragte ich. –
Meine Vermutung für den Downvote würde sein, dass jemand nur den Titel der Frage gelesen hat und angenommen hat, dass es eine Frage ohne Forschung darüber ist, was 'void' oder' volatile' isoliert bedeutet. –
@vsoftco sicherlich ist das eher eine Überschätzung (unter Leuten, die dem C++ - Tag sowieso folgen) - "volatile" ist allgemein bekannt und so ist die Bedeutung von einfachen Zeigerdeklarationen, also auch wenn diese spezifische Kombination vorher nicht gesehen wurde ausgearbeitet sein –