Fonction d'échange simple ... pourquoi celui-ci ne change-t-il pas?
Je suis nouveau sur C et encore en essayant de saisir la notion de pointeurs. Je sais comment écrire une fonction d'échange qui fonctionne...je suis plus concerné pourquoi celui-ci en particulier ne fonctionne pas.
void swap(int* a, int* b)
{
int* temp = a;
a = b;
b = temp;
}
int main()
{
int x = 5, y = 10;
int *a = &x, *b = &y;
swap(a, b);
printf(“%d %d\n”), *a, *b);
}
source d'informationauteur Adam Soffer
Vous devez vous connecter pour publier un commentaire.
Vous êtes absent
*
s dans la fonction de permutation. Essayez:De cette façon, au lieu de juste en remplaçant les pointeurs, vous êtes à la permutation de la
int
s que les pointeurs pointent à.Votre
swap()
fonction ne travail, après une mode, il permute les valeurs des variablesa
etb
locaux pourswap()
. Malheureusement, ceux qui sont distinctes de laa
etb
dansmain()
- de sorte que vous ne voyez pas en fait aucun effet à partir de la permutation.Lors de la réflexion sur les pointeurs, vous devez être clair sur quelques abstractions.
Un objet en mémoire. Cela peut être de tout type (et la taille). Un objet integer, par exemple, occupera 4 octets en mémoire (sur 32 bits machines). Un pointeur sur un objet occupera 4 octets en mémoire (sur 32 bits machines). Comme cela devrait être évident, l'objet integer détient des valeurs entières; un pointeur sur un objet contient les adresses des autres objets.
Le langage de programmation C permet de symboles (variables) représenter ces objets en mémoire. Lorsque vous déclarez,
int i;
le symbole (variable) i représente un entier de l'objet en mémoire. Plus précisément, il représente la valeur de cet objet. Vous pouvez manipuler cette valeur en utilisant i au programme.
&je vais vous donner l'adresse de cet objet en mémoire.
Un pointeur sur un objet peut contenir l'adresse d'un autre objet. Vous déclarez un pointeur sur un objet à l'aide de la syntaxe,
int* ptr;
Tout comme les autres variables, le pointeur de variable correspond à la valeur d'un objet, d'un pointeur d'objet. Cette valeur se trouve être une adresse d'un autre objet. Vous définissez la valeur d'un pointeur sur un objet comme ça,
ptr = &i;
Maintenant, quand vous dites ptr dans le programme, vous faites référence à sa valeur, qui est l'adresse de je. Mais si vous le dites *ptr, vous vous référez pas la valeur de ptr, mais plutôt la valeur de l'objet dont l'adresse est dans ptr c'est à dire que je.
Le problème avec votre fonction d'échange, c'est que vous êtes à la permutation des valeurs de pointeurs, pas les valeurs des objets que ces pointeurs tenir adresses pour. Pour obtenir les valeurs des objets, vous auriez à utiliser *ptr.
C est un passe-par-la valeur de la langue. Votre
swap
routine n'a pas de déréférencement de pointeurs est passé, donc, à partir demain
'point de vue rien ne s'est passé.Les pointeurs sont passés par valeur. Cela signifie un & b sont toujours a et b quand le retour de la fonction;
essayer quelque chose comme cela
La bonne façon de le faire:
Il n'swap. Il swaps les pointeurs locaux
a
etb
à l'intérieur deswap
fonction. Il swaps eux parfaitement bien, comme il se doit.Si vous voulez échanger les valeurs de ces pointeurs pointent vers, vous devez re-mettre en œuvre votre
swap
en conséquence, c'est à dire faire ce swap le fait de valeurs, pas les pointeurs.zildjohn1 la réponse est la méthode la plus simple et la plus claire possible. Toutefois, si vous insistez sur la permutation des pointeurs, alors vous devez passer le pointeur vers le pointeur parce que le pointeur lui-même est passé par valeur.
Umm peut-être à l'aide de cette
Sans l'aide d'une troisième variable (temp)
Vous devez envoyer à l'adresse de a et b pour la fonction d'échange ainsi, alors que l'appel de fonction d'échange, vous devez appeler le cul de swap (&a,&b)
De sorte que vous passer l'adresse, et de modifier l'adresse
Les bonnes œuvres.