Académique Documents
Professionnel Documents
Culture Documents
SMI3
Programmation I
Les pointeurs
1
Définition:
Un pointeur est une variable spéciale qui peut contenir
l'adresse d'une autre variable.
• En C, chaque pointeur est limité à un type de données. Il peut
contenir l'adresse d'une variable simple de ce type ou l'adresse
d'une composante d'un tableau de ce type.
• Si un pointeur p contient l'adresse d'une variable a, on dit que : ‘p
pointe sur a'.
• La taille d’un pointeur est fixe quelque soit le type de la variable
pointée
2
Dessin: p pointe sur a
10 a
&a
RAM
P
int a,b;
int *p; A35B 10 a
p = &a;
.
• le pointeur p contient l’adresse de la variable a .
.
…. A35B p
3
int a,b; A35B 10 a
.
int *p; .
.
p = &a;
…. A35B p
4
Déclaration:
type * pt;
Exemple:
5
Priorité de * et &
• Les opérateurs * et & ont la même priorité que les autres opérateurs
unaires (la négation !, l'incrémentation ++, la décrémentation --).
Dans une même expression, les opérateurs unaires *, &, !, ++, -- sont
évalués de droite à gauche.
• Si un pointeur P pointe sur une variable X, alors *P peut être utilisé
partout où on peut écrire X.
Exemple
Après l'instruction les expressions suivantes, sont équivalentes:
P = &X;
P
.
Comparaison:
if(p) ou if(p != NULL) ou if(p != 0)
7
• le nom d'un tableau représente l'adresse de son premier élément:
&tableau[0] et tableau sont une seule et même adresse
le nom d'un tableau est un pointeur constant
Exemple
int A[10]; int *P;
l'instruction: P = A; est équivalente à P = &A[0];
P + i correspond à p + i*sizeof(*p)
9
Toutes les opérations avec les pointeurs tiennent compte automatiquement
du type et de la grandeur des objets pointés.
Plus généralement, la soustraction de deux pointeurs qui pointent dans le même tableau est équivalente à la
soustraction des indices correspondants. 11
Exemple int tab[5], *p,*q;
p = tab;
q = &tab[3];
Alors
q-p vaut 3
12
Exercice 1:
Soit P un pointeur qui 'pointe' sur un tableau A:
int A[] = {12, 23, 34, 45, 56, 67, 78, 89, 90};
int *P;
P = A;
Quelles valeurs ou adresses fournissent ces expressions:
13
#include <stdio.h>
Exercice 2: main()
{ int A[10], N;
int *P,;
lire et afficher les éléments
/* Saisie des données */
d’un tableau de int en
do{
utilisant un pointeur P ,
printf("Dimension du tableau (max.10) : ");
scanf("%d", &N );
}while(N>10);
for (P=A; P<A+N; P++)
{
printf("Elément %d : ", P-A);
scanf("%d", P);
}
/* Affichage du tableau */
for (P=A; P<A+N; P++)
printf("%d ", *P);
return 0;
14
}
Exercice 3:
Ecrire un programme qui
/* Affichage du tableau */
range les éléments d'un tableau for (P1=A; P1<A+N; P1++)
A du type int dans l'ordre printf("%d ", *P1);
inverse. Le programme printf("\n");
utilisera des pointeurs P1 et P2 /* Inverser la tableau */
#include <stdio.h> for (P1=A,P2=A+(N-1); P1<P2; P1++,P2--)
main() { AIDE = *P1;
{int A[10], N, AIDE; *P1 = *P2;
int *P1, *P2; *P2 = AIDE;
/* Saisie des données */ }
do{ printf("Dimension du tableau (max.10) : "); /* Edition du résultat */
scanf("%d", &N ); for (P1=A; P1<A+N; P1++)
}while(N>10); printf("%d ", *P1);
for (P1=A; P1<A+N; P1++) return 0;
{ printf("Elément %d : ", P1-A); }
scanf("%d", P1);
15
}