bonjour
Actuellement j'essaie de comprendre les pointeurs, c'est la m..., et surtout je ne comprends pas bien dans quel cas on a intérêt à les utiliser
Le
pointeur nommons le Y pour l'exemple est un type particulier de variable qui correspond à une
adresse mémoire d'une autre variable X. Pour l'initialiser on affecte donc à la variable Y pointeur, l'adresse mémoire de cette variable X.
L'interêt du pointeur c'est qu'il permet de passer en paramètre par exemple l'adresse mémoire d'une table ou plus compliqué d'une structure complexe de données.
En passant en paramètre l'adresse si l'on sait quelle est la variable qui est pointée, on sait comment elle est organisée et comment y accéder ensuite. Il faut aussi savoir sa taille pour un tableau.
En passant un pointeur en paramètre cela permet d'éviter le passage d'une valeur (typiquement une structure) qui peut être encombrante alors qu'un pointeur fait typiquement 4 octets en terme de taille. Cela est indispensable avec des micro-contrôleurs qui n'ont pas forcément beaucoup de pile.
Mais surtout si on considère une fonction ou une procédure les paramètres sont passées par valeur ce qui les protègent mais ne permet pas de les modifier, dans certains cas particuliers en passant l'adresse on peut donc aller modifier l'objet pointé qui est le paramètre qui est fourni.
Pour des cartes à micro-contrôleurs complexes des périphériques sont reliés sur le bus d'adresse du micro le hardware fixe l'adresse, le logiciel ensuite y accède par l'intermédiaire d'un pointeur.
On peut aussi cas beaucoup plus compliqué, je ne suis pas persuadé que l'arduino le permette, avoir des pointeurs non pas sur une variable mais sur une fonction. Cela permet par exemple de faire une action particulière en fonction d'une valeur du logiciel. Pour faire un automate par exemple, si on appuie sur la touche avance rapide on doit exécuter l'action décrite dans la fonction avance rapide, de même si on appuie sur d'autres touches on affecte d'autres opérations. L'automate consiste alors à réaliser une fonction pointée différente (récupérée dans une table) en fonction de la valeur d'une touche.
Des pointeurs en les incrémentant permettent de faire par exemple des boucles de recopie de tableau, accéder à des tableaux multi dimensions. On peut aussi pointer un pointeur, comparer des pointeurs, faire des tableaux de pointeurs. (Une chaîne de caractères est un tableau avec 0 dans la dernière case, un tableau de pointeur peut s'initialiser avec plusieurs chaînes de caractère, les jours de la semaine par exemple.)
Pour revenir sur des applications basiques du pointeur :
int X,Y; //variables déclarées et réservées en mémoire
int *point; // déclaration du pointeur mais il ne pointe sur rien et ne réserve pas de place pour ce qu'il va pointer plus tard !
X=2;
point = &Y; // point pointe sur l'adresse de Y
*point = X; // la valeur de X est affectée à l'adresse pointée soit à Y
point +=1; // le pointeur est incrémenté dans le cas présent, bug potentiel l'objet pointé est incertain
Pour un tableau :
------------------------
int tableau[10];
int *point;
point = &tableau[0]; // point pointe sur le premier élément du tableau
point = tableau; // idem ci dessus
*(point + 2) = 44; // le 3 élément du tableau est initialisé à 44.
*(point + 9) = 56; // le dernier élément du tableau est initialisé à 56
*(point +10) = 100; // bug on accéde à une variable autre dans le logiciel mais plus dans le tableau, il faut toujours avoir en tête la taille du tableau pointé
point +=9;
*point +=4; // le dernier élément du tableau passe à 60
point--;
*point = 33; // l'avant dernier est initialisé à 33
cdlt lion10