Référence à un pointeur
char *str = "Hello";
char *ptr = str;
char *&rptr = str;
Quelle est la différence entre le ptr et rptr? Je comprends rptr est une référence à un pointeur(en théorie), mais comment est-il différent en termes de mise en œuvre avec le ptr?
Sont des références en C++ mises en œuvre à l'aide de pointeurs?
- Doublons possibles: stackoverflow.com/questions/57483/... stackoverflow.com/questions/620604/... stackoverflow.com/questions/1948467/... et probablement plus...
- L'avis de votre code devient non valide dans environ un an. Il a été obsolètes du point de littéraux de chaîne à l'aide de
char*
d'une dizaine d'années. - Tu veux dire que le standard ne permettent pas de ces littéraux de chaîne. La plupart des livres de toujours utiliser cette notation. Où puis-je avoir un aperçu de ce genre de détails?
- La norme C++ utilisé pour lister les déprécié de liaison de littéraux de chaîne à
char*
dans la section D4. Le C++0x FCD ne contient pas l'entrée de plus, ce qui je suppose signifie que la liaison est obsolète n'est plus, mais maintenant illégal, comme Johannes correctement fait remarquer 🙂 - La partie importante est que si vous voulez signaler à un littéral de chaîne, utilisez un
const char*
. Qui a toujours été et continuera d'être juridique.
Vous devez vous connecter pour publier un commentaire.
Si vous ne
char *world = "World"; rptr = world;
et ensuite imprimerstr
, il affichera "Monde". Si vous neptr = world;
et ensuite imprimerstr
, il affichera "Bonjour".rptr = "World"
parce que"World"
n'est pas unchar*
pointeur. La conversion implicite de la char tableau à un pointeur de char ne sera pas fait ici, parce que c'est un non-const de référence.char*
qu'il ne fonctionne pas. C'est commefloat a = 0; int &r = a;
échoue. Il est facile de négliger, mais tout aussi facile à comprendre une fois que vous voir ce qui est là-haut.char*& something = anArray;
, je suis en train de fairechar*& something = aPointer; something = anArray;
.str
est soit une variable locale ou globale (selon l'endroit où l'OP du code se trouve) et non déclarésconst
. Donc, il sera très certainement pas être stockées dans la mémoire en lecture seule (à moins que le compilateur ne peut pas prouver que la variable n'est jamais écrit, ce qui est impossible dans ce cas parce que l'on écrit pour elle).free
littéraux de chaîne, de sorte que la mémoire est "fuite" de toute façon. Oui, c'est pour le compilateur pour décider si ou de ne pas stocker les littéraux de chaîne en lecture seule section de la mémoire. Pas toutes les plates-formes de soutien, même de protection de la mémoire, de sorte qu'il serait une mauvaise idée pour la norme à faire des hypothèses à ce sujet. Et oui, c'est parfaitement légal selon la norme attribuer àstr
- c'est juste une variable comme les autres.str stocke l'adresse (et donc des points) à une chaîne littérale, "Bonjour", qui est stocké quelque part dans un segment en lecture seule de la mémoire.
ptr points à la même adresse que 'str'.
rptr essentiellement des points de 'str' (pas à la même pointee str, mais à la str elle-même). C'est peut-être inhabituel d'utiliser les "points" pour les références, mais ils sont vraiment très bien comme les pointeurs eux-mêmes (dans ce cas, un pointeur vers un pointeur) sauf avec de légères différences syntaxiques et la restriction qu'ils ne peuvent pas pointer vers une autre adresse au cours de leur vie.
Il serait analogue à:
Comme une référence, rptr ci-dessus ne peut pas être affecté à une nouvelle adresse (il ne peut pas changer ce qu'il pointe vers), mais il peut être libre de changer d'pointee (qui se trouve être un pointeur, dans ce cas, 'str').
Références sont à peu près la même en lecture seule pointeur (pas une mutable pointeur de lecture seule pointee) seulement ils ne nécessitent pas de référence à l'opérateur d'obtenir à la pointee (les données référencées):
La seule différence avec l'exemple ci-dessus avec un accès en lecture seule pointeur de pointeur, c'est que nous n'avons pas eu à utiliser l'opérateur*.
const références ont également la propriété unique d'être en mesure de prolonger la durée de vie temporaires, mais c'est probablement au-delà de la portée de la discussion.
Essayez ceci:
Il affiche "Hello world!", parce que
ptr
est un char pointeur pointant vers le littéral de chaîne "Bonjour ".rptr
est une référence à un pointeur de char, donc quand vous le changez (le pointeur, pas la chose du doigt.) vous changezstr1
. Et doncptr
points de "Bonjour ".str1
points de "le Monde!".