# Introduction générale à la programmation/Pointeurs
## Les pointeurs

Les pointeurs sont une notion souvent mal expliqué de la programmation, autant par sa délicatesse d’utilisation ou par le fait que les débutants ont souvent du mal à comprendre à quoi cela peut servir parce que beaucoup d'enseignants l'expliquent en partant de la fin.
Concrètement, chaque langage a sa propre définition de pointeurs, mais en programmation, un pointeur est une variable destinée à contenir une adresse.
(Il est à noter qu'un pointeur peut contenir l'adresse d’un autre pointeur. Cela fait un pointeur de pointeur. Un tel besoin n’est pas extrêmement courant mais peut arriver. En particulier pour les tableaux multidimensionnels. ex: double**** vTableau; vTableau[x][y][z]= new double;)
L'ours est une variable (quelconque).
L'homme qui a vu l'ours est le pointeur qui sait quelle est l'adresse de la variable. Il permet donc d'aller chercher l'ours (indirectement). Si on connait l'homme, il peut nous donner l'adresse de l'ours. Donc il n'y a plus besoin de connaitre l'ours lui-même (la variable), puisqu'on peut le retrouver grâce à l'homme qui a vu l'ours (le pointeur qui connait son adresse).

### Quel est l’intérêt des pointeurs

* En langage C, une méthode ne peut retourner au maximum qu'une seule valeur.
L'utilisation de pointeurs en langage c permet aux arguments (valeurs qui entrent dans une méthode) de conserver leurs modifications. Cela veut dire que grâce aux pointeurs une méthode peut retourner autant de valeurs qu'elle a d'arguments.
* Une méthode fait des copies des arguments passés par valeurs, et travaille avec ces copies. Ceci évite de modifier les valeurs des arguments par inadvertance. Cela signifie aussi que sur des arguments 'gros' (des grands tableaux par exemple), il faut que la méthode ait copié la totalité du tableau avant de travailler dessus.
Elle ferait naturellement une copie de la vidéo ou de l'encyclopédie … :(
Attention, on travaille directement avec les données originales. Il vaudrait donc mieux avoir une copie de ces fichiers avant d'appeler la méthode.
* En langage C le nom d'une méthode est un pointeur. On peut donc l’utiliser comme argument d'une fonction.
DONC :
* Les pointeurs servent à éviter de saturer la pile avec un bloc de données trop important. Il vaut mieux créer un tableau de 10000 chaînes de caractères en tas(gestion par la mémoire virtuelle) que de le créer dans la pile avec tous les problèmes de gestion que cela implique (Surcharge, effondrement de la pile, buffer overflow, réécriture d'adresse de retour, etc …). De plus avec les pointeurs multiples le contrôle sur les éléments d’un tableau multidimensionnel est beaucoup plus simple et aisé que sur un tableau monolithique en pile.
* L'utilisation de pointeurs est recommandé par le "Design Pattern" "FlyWheight" qui permet d'attribuer à un nombre conséquents d'objets un nombre limité de valeurs sans surcharger la mémoire avec toutes les valeurs possibles.
* Les pointeurs permettent de s'affranchir de la notion de méthode. (n entrées et une ou zéro sortie)
* Avec l’utilisation des pointeurs, on peut avoir n entrées et n+1 sortie (+1 = return)
* On préférera utiliser des tableaux, des structures, ou mieux, des objets pour résoudre ce type de problèmes.
* En C, les paramètres sont passés par valeur.
* Le c fait une copie des arguments de la méthode, et travaille avec cette copie.
* Les pointeurs permettent de passer les valeurs par adresses (en copiant la valeur de l'adresse), donc de travailler directement sur les données avec le risque de corrompre les données.
* On peut utiliser directement le nom d'une méthode comme argument parce que c’est aussi un pointeur. C’est d'ailleurs ce qui a permis la création du compilateur objet en C++ par Bjarns STROUSTRUP en utilisant une table de virtualisation intégré à une structure et des pointeurs sur méthodes.

## Exemple d'algorithme pour l’utilisation de pointeurs de fonctions

Cette fonction dessine f.
Cela donne le résultat :
Avec la fonction f qui est fixe, dessine_f ne sait dessiner que la forme "_/-\_".
cela donne quelque chose du type :

## Exemple de code pour d’utilisation de pointeurs de fonctions
### Exemple numérique

* Testé sous Code Block (Windows,Linux).
* Passer deux pointeurs de fonctions à une fonction.
* Ici on passe les deux fonctions f et g à la fonction f1_o_f2.
* La même fonction peut calculer gof, fog et fof…
* On peut remarquer que les pointeurs de fonctions ont les mêmes types arguments que les fonctions qu’ils vont recevoir.
Résultat ;

### Exemple graphique (avec Gnuplot)

* Testé sous Code Block (Windows,Linux).
* Passer un pointeurs de fonctions à une fonction.
* La fonction Gplt dessine f(x) et g(x)…
* On peut remarquer que les pointeurs de fonctions ont les mêmes types arguments que les fonctions qu’ils vont recevoir.
Pour approfondir ce travail : Mathc Home Edition t01/Gnuplot
* Récursivité