Comment déclarer un pointeur scalaire (valeur unique) ?
byte *p1_b; byte *p2_b;
int *p1_i; int *p2_i;
long *p1_l; long *p2_l;
float *p1_f; byte *p2_f;
Comment initialiser un pointeur ?
Affectation d’une adresse mémoire constante OU bien
L’adresse d’une variable de même type (Opérateur “&”)
Un pointeur vide: NULL: p1_b=NULL;
Exemples
int *p; int valP;
p= &valP; // Adresse d'une variable
p= 0x00ff; // Adresse constante
Comment savoir la taille d’une variable ?
=> Anticiper la location mémoire et l’adressage
Voir le programme
Opérations sur les pointeurs = Mêmes opérations sur les variables
byte *p_b;
int *p_i ;
double *p_d;
p_b=p_b+1; // Avance d'un octet en mémoire
p_i=p_i+1; // Avance de "2" octets en mémoire
p_d=p_d+1; // Avance de "8" octets en mémoire
p_d=p_d+10; // Avance de 8x10 octets en mémoire !!!!!
p_d=p_d+n; // Avance e 8xn octets
Les pointeurs et les tableaux
int tab[10];
tab ou tab[0] est un pointeur contant sur le premier élément du tableau
Si je connais l’adresse du premier élément et son type je peux ensuite
accéder à l’ensemble des éléments du tableau!
int tab[10], *ptab;
ptab=&tab[0]; // je pointe sur le premier élément
Exemple
for(int i=0;i<10;i++)
{
// Init 1
tab[i]=10;
// Equivalent à
*(ptab+i)=10; // Contenu de l'adresse ptab+i
}
Tableau & la mémoire (optimisation de la mémoire)
byte tab[10]; // 10*1=10 octets
int tab[10]; // 10*2=20 octets
double tab[10] // 10*8=80 octets
=> Rapport de 1 à 8, il faut tenir en compte le type de données
Avant d’effectuer la location mémoire.
Plusieurs tableaux ayant la même adresse
=>Une seule initialisation est suffisante pour l’ensemble des tableaux
byte a, *pa;
unsigned char *MyPORTA;
word AddPORTA,Adda;
void setup()
{
// Init port série
Serial.begin(9600);
// Init pointeurs
pa=&a;
MyPORTA=&OCR3CH;
}
void loop()
{
// Affichage de la taille des variables
Serial.println("Tailles");
Serial.println(sizeof(a));
Serial.println(sizeof(PORTA));
Serial.println("----------");
// Init des valeurs des pointeurs
*pa=10; PORTA=40;
AddPORTA=MyPORTA; // Ou bien AdPORTA=MyPORTA;
Adda=(word)pa;
// Affichage des valeurs des variables
Serial.println("Valeurs");
Serial.println(a);
Serial.println(PORTA);
Serial.println("----------");
// Affichage des adresses
Serial.println("Adresses");
Serial.println(Adda);
Serial.println(AddPORTA);
Serial.println("----------");
// délai de la boucle
delay(2000);
}