C++ Permutation Des Pointeurs
Je suis en train de travailler sur une fonction de swap pointeurs et je ne peux pas comprendre pourquoi cela ne fonctionne pas. Quand j'imprime r et s dans la fonction d'échange les valeurs sont inversées, ce qui m'amène à croire que je suis la manipulation d'une copie de ce que je ne comprends pas parce que je passe par référence de p et de q.
void swap(int *r, int *s)
{
int *pSwap = r;
r = s;
s = pSwap;
return;
}
int main()
{
int p = 7;
int q = 9;
swap(&p, &q);
cout << "p = " << p << "q= " << q << endl;
return 0;
}
Imprime: p = 7q = 9
- Vous êtes à la manipulation des copies de pointeurs, pas les données qu'ils pointent. Il est plus facile de
std::swap(p, q);
. Ou, si la proposition fait en fait en,p :=: q;
dans le futur. - Waaaat. Pouvez-vous lier à ladite proposition? (A la recherche des symboles est dur.)
- Oui, bien sûr. Voici. J'avais de grands doutes que ça à faire.
- Désolé, je suis nouveau essayer de l'apprendre, comment suis-je la manipulation des copies si je suis passé par référence?
- Merci. Très cool.
- Les pointeurs sont eux-mêmes des copies et vous êtes à la permutation entre eux. Vous avez besoin de déréférencement à obtenir ce qu'ils indiquent et échange.
- Vous avez besoin de déréférencement de pointeurs. Mais c'est sujette à des erreurs, car ils pourraient être nulle, de sorte que vous devriez utiliser des références à la place. (Notez que vous ne sont pas, en fait, en passant rien de référence. Vous êtes à la transmission de valeurs, qui se produisent à des pointeurs.)
- Merci, de sens maintenant.
Vous devez vous connecter pour publier un commentaire.
À l'intérieur de votre
swap
fonction, vous êtes juste de changer la direction de pointeurs, c'est à dire, changer les objets sur laquelle pointe le pointeur (ici, précisément, c'est l'adresse des objetsp
etq
). les objets pointée par le pointeur ne sont pas du tout changé.Vous pouvez utiliser
std::swap
directement. Ou le code de votre fonction d'échange comme suit:return
déclaration inutile?La accepté de répondre par taocp n'a pas assez de swap pointeurs soit. Ce qui suit est la bonne façon de swap de pointeurs.
La ligne
r=s
est une copie du pointeurr
à la copie du pointeurs
.À la place (si vous ne souhaitez pas utiliser la fonction std:swap), vous devez, pour ce faire
Vous avez passé des références à vos valeurs, qui ne sont pas des pointeurs. Ainsi, le compilateur crée temporaire
(int*)
's et passe ceux de la fonction.Penser à ce
p
etq
sont: ils sont variables, ce qui signifie qu'ils sont des machines à sous alloué quelque part dans la mémoire (sur la pile, mais ce n'est pas important ici). En quel sens peut-on parler de "changement de l'pointeurs"? Ce n'est pas comme vous pouvez échanger les adresses des machines à sous.Ce que vous pouvez faire est de swap de la valeur de deux conteneurs qui détiennent le réel d'adresses et ceux qui sont des pointeurs.
Si vous voulez échanger des pointeurs, vous devez créer des variables de pointeur, et passer à la fonction.
Comme ceci:
Vous n'êtes pas le passage par référence dans votre exemple. Cette version passe par référence,
Le passage par référence n'est pas le même que le passage par valeur ou par pointeur. Voir C++ tutoriels sur le web pour toute explication. Mon cerveau est trop petit pour les déchets des cellules de stockage de la finesse des détails que je peux trouver sur le web facilement.
swap
fonction.r = s
quandr
ets
sont des références signifie la même chose que*p = *q
quandp
etq
sont des pointeurs. Vérifier sur votre débogueur en observant les emplacements de mémoire où p et q sont stockées.