La plupart des développeurs rencontrent des pointeurs en C via un mécanisme spécifique appelé pass-by-pointer. Ce n’est pas seulement une bizarrerie de syntaxe ; c’est la raison fondamentale pour laquelle les fonctions peuvent modifier l’état externe. Vous avez probablement déjà vu cela sans vous en rendre compte. Considérez la fonction scanf. Chaque fois que vous appelez scanf, vous êtes obligé d’ajouter l’opérateur d’adresse de (& ) à vos variables.
scanf("%d", &monNuméro);
Si vous omettez cette esperluette, le programme plante. Pourquoi? Parce que scanf attend une adresse mémoire, pas une valeur. Comprendre ce comportement déverrouille la logique derrière la façon dont C gère les paramètres de fonction. Lorsque vous transmettez un pointeur, vous accordez à une fonction l’autorisation d’accéder à votre mémoire et de réécrire directement les données.
Зміст
L’échec du passage par valeur
Pour comprendre pourquoi les pointeurs sont nécessaires, nous devons regarder ce qui se passe lorsqu’ils sont absents. Une erreur courante du débutant consiste à tenter d’écrire une fonction « swap » qui échange deux valeurs entières.
Voici une implémentation naïve qui échoue :
Exécutez ce code. La sortie affichera « 5 10 » suivi de « 5 10 ». L’échange n’a pas eu lieu.
La raison est simple. En C, les arguments sont passés par valeur par défaut. Lorsque swap(a, b) est appelé, le système crée des copies locales de a et b nommées i et j. La fonction échange parfaitement les valeurs de « i » et « j ». Mais lorsque la fonction revient, ces variables locales sont détruites. Les « a » et « b » d’origine dans « main » restent intacts.
La solution : passage par pointeur
Pour modifier les variables d’origine, la fonction doit accéder à leurs emplacements de mémoire réels, et non à des copies de leurs valeurs. C’est là que les pointeurs pour les paramètres de fonction deviennent essentiels.
Voici l’implémentation corrigée :
Maintenant, le résultat est « 5 10 » suivi de « 10 5 ». L’échange a fonctionné.
Comment fonctionne le déréférencement de pointeur
La différence réside dans ce qui est transmis à la fonction.
- L’appel :
swap(&a, &b)transmet les adresses deaetb. - Les paramètres : La signature de fonction
void swap(int *i, int *j)déclareietjcomme pointeurs vers des entiers. - La connexion : À l’intérieur de
swap,icontient l’adresse dea.jcontient l’adresse deb. - Le déréférencement : L’instruction
*i = *jsignifie “aller à l’adresse mémoire stockée dansiet y écrire la valeur trouvée à l’adresse mémoire stockée dansj.”
Visuellement, imaginez deux cases étiquetées « a » et « b ».
– a contient 5.
– b contient 10.
– i est une note avec l’adresse de la case a écrite dessus.
– j est une note avec l’adresse de la case b écrite dessus.
Lorsque le code exécute « t = *i », il lit la note « i », se rend à cet emplacement et lit la valeur « 5 ». Il stocke « 5 » dans « t ». Ensuite, *i = *j lit la valeur de la case b (qui est 10 ) et la réécrit dans la case a. Les boîtes d’origine ont changé.
























