Quelles sont les différences entre le pointeur constant et volatile en C? p>
4 Réponses :
Voici une explication de ces deux concepts p>
le mot clé Const spécifie que le pointeur ne peut pas être modifié après l'initialisation; Le pointeur est protégé de la modification par la suite. em> p>
le mot clé volatile spécifie que la valeur associée au nom que suit peut être modifiée par des actions autres que celles de l'application utilisateur. Par conséquent, le mot clé volatile est utile pour déclarer des objets dans la mémoire partagée pouvant être accessible par plusieurs processus ou zones de données globales utilisées pour la communication avec les routines de service d'interruption. EM> P>
Il vient de ici P>
Un pointeur de const (i.e. Soyez prudent, const char * s = .. / code>) pointe vers des données qui peuvent pas em> être modifiées. Un pointeur volatil (I.e.
volatile char * s = ... code>) indique le compilateur de ne pas mettre en cache les données que le pointeur se réfère aux registres de la CPU ou ailleurs. Au lieu de cela, ils sont relisons de leur emplacement de mémoire d'origine à chaque fois qu'ils sont nécessaires. Ceci est nécessaire si le contenu des données pourrait changer en dehors de la portée du compilateur, par exemple à travers un deuxième fil de la modification de la modification. p>
Const Char * Code> et
Char * Const Code> sont des choses différentes, identiques pour le qualificatif code> code>. Si vous n'êtes pas sûr, regardez-les. P>
normalement, Edit: Notez que même si vous n'êtes pas autorisé à modifier les données via un pointeur const code> ou
volatile code> s'applique au pointeur, pas le pointeur lui-même. P>
const code> Vous n'êtes pas autorisé à modifier le pointee via ce pointeur. p>
volatile code> signifie que quelqu'un d'autre pourrait modifier le pointee, même si votre code ne le fait pas. Cela signifie également que l'écriture à la variable pourrait faire quelque chose de plus que de stocker une valeur à récupérer la prochaine fois que la variable est utilisée. En conséquence, chaque fois que votre code lit ou écrit une valeur volatile, le compilateur est obligé de générer du code qui se lit de (ou écrit à) la mémoire réelle, non seulement (par exemple) alloue un registre à usage temporaire et lit / lion / écrit le registre. p>
const code>, les données peuvent toujours être modifiées par d'autres moyens. En fait, il y a des moments où vous pouvez avoir un pointeau qui est à la fois
const code> et em>
volatile code>, ce qui signifie que vous ne pouvez pas le changer, mais quelqu'un sinon pourrait. P>
Cela dépend si c'est const char * p code> ou
char * const p code>. Vous pouvez assez raisonnablement avoir
const char * const p code>.
La différence revient vraiment à la différence entre maintenant, sont Vous demandez la différence entre P> et p> ou la différence entre p> et p> dans l'ancien cas: donc: p> dans ce dernier cas: const code> et
volatile code>. Les seules choses que ces deux concepts ont en commun sont la syntaxe.
Const CODE> est appliqué au compilateur et dit "Le programmeur ne peut pas changer ceci".
volatile code> dit "Ces données peuvent être modifiées par une autre personne" et le compilateur ne fera donc aucune hypothèse sur ces données. Sans
volatile code> Le compilateur peut dire "Je mets ces données de la mémoire dans un registre et que je n'ai rien fait à ces données, je suis sûr que c'est la même chose et je n'ai pas besoin de lisez-le à nouveau dans le registre. " Lorsque les données sont marquées comme
volatile code> Le compilateur ne fera pas une telle hypothèse (parce que quelqu'un d'autre aurait peut-être modifié les données) et cela relire les données dans le registre.
p code> est un pointeur sur un
int code> et où que les points de pointeur ne peuvent pas être modifiés par le programmeur tandis que
q code> est un pointeur sur un
int code> et où ces points de pointeur pourraient être modifiés par une personne autre que le programmateur de sorte que le compilateur fait Aucune hypothèse sur ce pointeur. p>
p code> est un pointeur sur un
INT code> et quel
p code> pointe pour ne pas être modifié par le programmeur tandis que
q code> est un pointeur sur un
int code> et quoi
q code> est pointé pour pouvoir être modifié par quelqu'un d'ot elle que le programmeur de sorte que le compilateur ne fait aucune hypothèse sur ces données. p>
Une autre utilisation légitime pour volatile code> est lorsque l'acte d'accéder aux données est significatif lui-même, ce qui est raisonnablement probable dans les E / S mappés en mémoire. Dans 1.9 (6) de la norme, "comportement observable" est défini comme "la séquence de lecture et écrivez à
volatiles code> et appels aux fonctions d'E / S de la bibliothèque".
Ils sont complètement différents. Avez-vous même jeté un coup d'œil à la documentation?
@Anon: Mais ils ont le contexte opposé. La question est légitime pour un débutant. +1 pour équilibrer.
@Le_Drow: Ils regardent en face, mais
const volatile code> est un qualificatif CV parfaitement légitime, ce qui signifie "le programme ne le change pas, mais quelque chose d'autre pourrait, ou que l'accès pourrait faire quelque chose en soi" .
Vrai mais c'est bien sur la tête de Newbie. Les barrières de mémoire et autres cauchemars de faible niveau sont les idiomes de développeurs beaucoup plus expérimentés. À un débutant, ils semblent être opposés.
Les débutants doivent être immédiatement encouragés à ne pas penser à eux comme des opposés, même s'ils ne traitent pas de "cauchemars de faible niveau". Sinon, ils pourraient finir par penser que
const code> signifie que vous (et le compilateur) peut supposer que la valeur ne peut pas changer, ce qui n'est pas catégoriquement pas le cas lorsque les pointeurs sont impliqués. Par exemple, un
Const Char code> Impossible de modifier la valeur, mais le caractère pointé sur un
const char * code> peut valablement modifier la valeur lorsque votre dos est tourné (par exemple en raison de l'aliasing ).