Un exemple classique : Swap
Fait partie de la section Logique & Flux du Journey C de Coddy. Leçon 28 sur 63.
La fonction swap est l’un des exemples les plus célèbres qui démontrent pourquoi les pointeurs sont essentiels en programmation C. L’objectif est simple : écrire une fonction qui échange les valeurs de deux variables. Cependant, cette tâche apparemment simple révèle une limitation fondamentale du passage par valeur.
Considérez ce qui se passe si vous essayez d'échanger deux variables en utilisant le passage par valeur classique :
void badSwap(int a, int b) {
int temp = a;
a = b;
b = temp;
// Cela n'échange que les copies, pas les variables d'origine !
}Cette approche échoue car la fonction ne reçoit que des copies des valeurs. Les variables originales dans la fonction appelante restent inchangées.
La solution nécessite de passer des pointeurs vers les variables à la place :
void swap(int *a, int *b) {
int temp = *a; // Stocke la valeur à l'adresse a
*a = *b; // Place la valeur de l'adresse b dans l'adresse a
*b = temp; // Place la valeur stockée dans l'adresse b
}En transmettant les adresses des variables et en utilisant l’opérateur de déréférencement, la fonction peut modifier directement les valeurs des variables d’origine. Cela fait de la fonction d’échange une parfaite démonstration des situations où et des raisons pour lesquelles vous avez besoin de pointeurs pour accomplir des tâches que le passage par valeur ne peut tout simplement pas gérer.
Défi
FacileÉcrivez un programme C qui implémente et démontre la fonction classique d’échange à l’aide de pointeurs. Votre programme doit :
- Créer une fonction nommée
swapqui prend deux pointeurs vers des entiers comme paramètres - À l’intérieur de la fonction
swap, échanger les valeurs aux adresses mémoire pointées par les deux pointeurs à l’aide d’une variable temporaire - Dans la fonction
main, lire deux entiers saisis par l’utilisateur - Afficher les valeurs d’origine au format suivant :
Before swap: a = [value], b = [value] - Appeler la fonction
swapet transmettre les adresses des deux variables à l’aide de l’opérateur d’adresse - Après l’appel de la fonction, afficher les valeurs échangées au format suivant :
After swap: a = [value], b = [value]
Votre résultat doit démontrer que la fonction échange correctement les valeurs des variables d’origine :
Before swap: a = [first_input], b = [second_input]
After swap: a = [second_input], b = [first_input]Ce défi montre pourquoi les pointeurs sont essentiels pour l’opération d’échange : la fonction doit accéder aux emplacements mémoire des variables d’origine afin d’échanger définitivement leurs valeurs, ce qui est impossible avec un passage par valeur.
Essayez vous-même
#include <stdio.h>
// À FAIRE : Écrivez votre fonction d'échange ici
int main() {
int a, b;
// Lire l'entrée
scanf("%d", &a);
scanf("%d", &b);
// Afficher les valeurs originales
printf("Before swap: a = %d, b = %d\n", a, b);
// À FAIRE : Appelez votre fonction d'échange ici
// Afficher les valeurs échangées
printf("After swap: a = %d, b = %d\n", a, b);
return 0;
}Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logique & Flux
1Les bases des pointeurs
Qu'est-ce qu'un pointeur ?Déclaration de pointeursL'opérateur d'adresse (&)L'opérateur de déréférencement (*)Pointeurs NULLRécapitulatif : Les bases des pointeurs4Projet : Utilitaire de texte simple
Présentation du projetCompter les caractères2Pointeurs et Tableaux
Noms de tableaux comme pointeursÉléments de tableau - PointeursArithmétique des pointeursComparaison de pointeursRécapitulatif : Parcours de tableau par pointeur5Pointeurs et fonctions
Passage par valeurPassage de pointeurs aux fonctionsModifier des variables via des pointeursUn exemple classique : SwapPassage de tableaux aux fonctionsRécapitulatif : Pointeurs comme arguments de fonction3Tableaux de caractères et chaînes
Les chaînes comme tableaux de charLe terminateur nulSaisie de chaînes avec scanfUtilisation de strlen()Utilisation de strcpy()Utilisation de strcat()Utilisation de strcmp()Récapitulatif : Fonctions de base sur les chaînesEntraînez-vous par vous-même : Compilateur C en ligne