9
votes

Quelles sont les différences entre le pointeur constant et volatile en C?

Quelles sont les différences entre le pointeur constant et volatile en C?

c

5 commentaires

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 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 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 Impossible de modifier la valeur, mais le caractère pointé sur un const char * peut valablement modifier la valeur lorsque votre dos est tourné (par exemple en raison de l'aliasing ).


4 Réponses :


1
votes

Voici une explication de ces deux concepts

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.

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.

Il vient de ici


0 commentaires

1
votes

Un pointeur de const (i.e. const char * s = .. / code>) pointe vers des données qui peuvent pas être modifiées. Un pointeur volatil (I.e. volatile char * s = ... ) 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.

Soyez prudent, Const Char * et Char * Const sont des choses différentes, identiques pour le qualificatif . Si vous n'êtes pas sûr, regardez-les.


0 commentaires

2
votes

normalement, const ou volatile s'applique au pointeur, pas le pointeur lui-même.

const Vous n'êtes pas autorisé à modifier le pointee via ce pointeur.

volatile 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.

Edit: Notez que même si vous n'êtes pas autorisé à modifier les données via un pointeur const , 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 et volatile , ce qui signifie que vous ne pouvez pas le changer, mais quelqu'un sinon pourrait.


1 commentaires

Cela dépend si c'est const char * p ou char * const p . Vous pouvez assez raisonnablement avoir const char * const p .



15
votes

La différence revient vraiment à la différence entre const et volatile . Les seules choses que ces deux concepts ont en commun sont la syntaxe. Const est appliqué au compilateur et dit "Le programmeur ne peut pas changer ceci". volatile 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 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 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.

maintenant, sont Vous demandez la différence entre xxx

et xxx

ou la différence entre xxx < / pré>

et xxx

dans l'ancien cas: p est un pointeur sur un int et où que les points de pointeur ne peuvent pas être modifiés par le programmeur tandis que q est un pointeur sur un int 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.

donc: xxx

dans ce dernier cas: p est un pointeur sur un INT et quel p pointe pour ne pas être modifié par le programmeur tandis que q est un pointeur sur un int et quoi q 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. xxx


1 commentaires

Une autre utilisation légitime pour volatile 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 et appels aux fonctions d'E / S de la bibliothèque".