Pourquoi ces fonctions de swap se comportent-elles différemment?

#include  void swap1(int a, int b) { int temp = a; a = b; b = temp; } void swap2(int *a, int *b) { int *temp = a; a = b; b = temp; } void swap3(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } main() { int a = 9, b = 4; printf("%d , %d\n", a, b); swap1(a, b); printf("%d , %d\n", a, b); swap2(&a, &b); printf("%d , %d\n", a, b); swap3(&a, &b); printf("%d , %d\n", a, b); } 

    C a une sémantique de valeur pour les parameters de fonction. Cela signifie que les a et b de vos trois variantes d’échange sont des variables locales des fonctions respectives. Ce sont des copies des valeurs que vous transmettez comme arguments. En d’autres termes:

    • swap1 échange les valeurs de deux variables entières locales – aucun effet visible en dehors de la fonction
    • swap2 échange les valeurs de deux variables locales, qui sont des pointeurs dans ce cas, – idem, aucun effet visible
    • swap3 a raison et échange les valeurs swap3 par les variables de pointeur locales.

    Votre fonction swap2 n’a aucun effet.

    Vous passez dans deux pointeurs. Dans la fonction, les variables (parameters) a et b sont locales à la fonction. La fonction swap2 échange simplement les valeurs de ces variables locales, sans effet en dehors de la fonction elle-même.

    Comme Anon l’a fait remarquer, swap1 a le même problème: vous ne faites que modifier des variables locales.

    swap1 ne fonctionnera pas car la fonction vient de copier les arguments, sans affecter les variables de main .

    swap2 ne fonctionnera pas non plus.

    swap1() et swap2() ont un effet limité à la scope de la fonction elle-même: les variables échangées sont des parameters passés par copie et toute modification qui leur est appliquée n’a pas d’impact sur la variable source de votre main() copiée l’appel de fonction.

    swap3 fonctionne car il agit sur les valeurs indiquées par les parameters, au lieu d’agir sur les parameters eux-mêmes. C’est le seul des trois qui modifie la valeur située à l’adresse de la mémoire dans laquelle sont stockées les variables a et b votre main() .

    Juste pour le plaisir, échangez des valeurs sans utiliser de variable temporaire

     x = x ^ y y = x ^ y x = x ^ y