Pointeurs
Pointeurs
Pointeurs
325 P: pointeur
Partie1: Les
pointeurs
12.5 x: variable
Fenineche Khadidja 2
Objectifs du chapitre
Fenineche Khadidja 3
1- Représentation des données en mémoire
Fenineche Khadidja 8
2- Un pointeur en langage C
Exemples illustrés de
Kernighan et Ritchie
• int x = 1, y = 2, z[10];
• int *pi;
• pi = &x;
• y = *pi;
• *pi = 0;
• pi = &z[0];
Source: Internet
Fenineche Khadidja 14
2- Un pointeur en langage C
E/ opérations sur un pointeur
Un pointeur contient l’adresse du premier octet
d’une variable de type donné.
Si p pointe sur une variable de type int (4 octets)
alors p+1 est l’adresse +4.
Si p pointe un double (8octets) alors p+1 est
l’adresse +8.
4 octets (int)
Cette …….
Valeur entière 1 Valeur entière 2
représentation
est à retenir
pour les
tableaux P P+1 P+2
Fenineche Khadidja 15
3- Utilisation des pointeurs en langage C
P->champ1 (*p).champ1
accède au contenu du champ de la variable pointée
par p de type structure.
Fenineche Khadidja 16
3- Utilisation des pointeurs en langage C
A- Pointeur vers une structure (Exemple)
#include <stdio.h>
struct article
{int code;
float prix;};
int main()
{
struct article art, *p=&art;
p->code=1452; /* accès à la valeur du champ de la variable pointée
par p */
p->prix=1000.00;
printf("Le code de l'article saisi est %d\n",art.code); /* (*p).code*/
printf("Le prix de l'article saisi est %f\n",art.prix); /* p->prix */
return 0;
}
Fenineche Khadidja 17
3- Utilisation des pointeurs en langage C
B- Pointeurs et passage de paramètres par adresse.
• Si on veut modifier le contenu d’une variable passée
comme paramètre à une fonction, on doit faire un
passage par adresse. Le passage par valeur laisse la
variable inchangée.
• Le passage par valeur ne peut retourner plus d’une
valeur à une fonction (return valeur).
• Le passage par adresse nécessite l’utilisation des
pointeurs.
• Les pointeurs permettent de rendre plus d’un
résultat au programme appelant.
• L’appel d’une fonction dans ce cas se fait avec
l’opérateur & avant la Fenineche
variable Khadidja
ou avec un pointeur. 18
B- Pointeurs et passage de paramètres par adresse (exemple1).
#include <stdio.h> #include <stdio.h>
int main() int main()
{void changer(int* x); {void changer(int* x);
int a=3; int a=3;
changer(&a);/* va multiplier a par int *p=&a;
5 */ changer(p);/* va multiplier a par 5
printf("La valeur de a est à */
%d\n",a); printf("La valeur de a est à
return 0; %d\n",*p);
} return 0;
void changer(int* x) }
{ void changer(int* x)
(*x)*=5; { (*x)*=5; }
}
Fenineche Khadidja 19
B- Pointeurs et passage de paramètres par adresse (exemple2).
#include <stdio.h>
int main()
{
void permuter(int* x, int*y); /* permute deux variables */
int a=3,b=5;
permuter(&a,&b);
printf("La valeur de a= %d et b= %d\n",a,b); /* a=5 et b=3*/
return 0;
}
void permuter(int*x,int*y)
{
int tmp;
tmp=*x;
*x=*y;
*y=tmp;
}
Fenineche Khadidja 20
3- Utilisation des pointeurs en langage C
C- Pointeurs et tableaux
• Le nom d’un tableau est considéré comme une
adresse (adresse du premier élément).
• Si on utilise un pointeur vers un tableau, ce dernier
sera égal au nom du tableau:
Exemple:
int M[5];
int *p;
p=M; /* ou p=&M[0]; */
• L’adresse d’un tableau est constante, on ne peut lui
affecter l’adresse stockée dans un pointeur.
• p=M; est vrai mais M=p; estKhadidja
Fenineche fausse 21
3- Utilisation des pointeurs en langage C
C- Pointeurs et tableaux
• On peut manipuler un tableau avec ses indices
comme d’habitude ou à l’aide de pointeurs avec
différentes façons.
• Il est à noter que:
Si p est &M[0] alors p+1 est &M[1], p+2 est &M[2],…
donc *p est M[0], *(p+1) est M[1], …
Ainsi, si on a: p=M
On peut afficher le tableau M de cette façon:
For(i=0;i<n;i++) printf("%d",*(p+i));)
Fenineche Khadidja 22
3- Utilisation des pointeurs en langage C
C- Pointeurs et tableaux
M
*P *(P+1) *(P+2)
Remarque: A un moment
P P+1 P+2 donné P peut recevoir une
autre adresse mais ce n’est
&M[0] &M[1] &M[2]
pas le cas de M qui est une
valeur constante (adresse
constante).
Fenineche Khadidja 23
3- Utilisation des pointeurs en langage C
C- Pointeurs et tableaux (exemple avec les fonctions)
#include <stdio.h> 1- Initialise un tableau avec une
void init(int *x,int taille,int val) valeur val
2- On peut soit utiliser la
{int i;
méthode habituelle ou
for(i=0;i<taille;i++) x[i]=val; } *(x+i)=val;
int main()
{ int T[5]={1,2,3,7,8};
affiche(T,5); 1- On initialise le tableau
avec la valeur 12.
init(T,5,12); /* initialise tout le tableau
2- on ne met pas &T car T est
avec 12 */ une adresse
affiche(T,5);
return 0; }
Fenineche Khadidja 24
3- Utilisation des pointeurs en langage C
C- Pointeurs et tableaux (opérations entre pointeurs et tableaux)
Soient les déclarations suivantes: int M[10], *P;
Les écritures suivantes peuvent être correctes ou fausses
• P= M; /* correct : P reçoit l’adresse du premier élément du
tableau M*/
• M = P; /* Erreur, on ne peut affecter à un tableau de cette
façon*/
• M++; /* Erreur, on ne peut passer à la case suivante de cette
manière.
• P = &M[1]; /* correct : P reçoit l’adresse du deuxième élément
du tableau*/
• *P += 1; /* correcte: incrémente M[1] de 1*/
• P += 1; /* correct: passe à l’élément M[2]*/
• *(M+1); /* équivalent à M[1] */
Fenineche Khadidja 25
3- Utilisation des pointeurs en langage C
Exemple d’affichage d’un tableau en utilisant les pointeurs
Fenineche Khadidja 26
3- Utilisation des pointeurs en langage C
Exemple: Calcul de la longueur d’une chaine
#include <stdio.h>
int main()
{
int taille_chaine(char* chaine);
char ch[20];
printf("Introduisez votre chaine: ");
scanf("%19s",ch);
printf("La taille de la chaine %s est: %d",ch,taillechaine(ch));
}
int taillechaine(char* chaine)
{ int i = 0;
while(*(chaine+i)!='\0') i++;
return i;} Fenineche Khadidja 27
3- Utilisation des pointeurs en langage C
C- Pointeurs et tableaux à deux dimensions
• Un tableau a deux dimensions peut être considéré comme un
tableau simple et chaque case est elle-même un tableau
(tableau de tableaux).
• Soit un tableau M de 3X10 (mXn), alors M pointe sur la
première ligne.
• Si p pointe ce tableau alors les éléments sont accessibles via les
adresses suivantes:
• Pour un élément M[i][j], on y accède avec p par: p+j+i*n
P P+1 P+9
M 12 0 4 1 -2 2 3 45 4 5
P+0+10 P+1+10 P+9+10
M+1 7 8 -12 -3 1 0 2 9 42 12
P+0+2*10 P+1+2*10 P+9+2*10
M+2 -3 -5 5 1 4 5 7 1 0 2
Fenineche Khadidja 28
3- Utilisation des pointeurs en langage C
C- Exemple saisie des éléments d’un tableau à deux dimensions
avec les pointeurs)
#include <stdio.h>
#define m 2
#define n 3
int main()
{int X[2][3]={{1,3,6},{0,4,8}};
int *p; int i,j;
p=(int *)X;; \* p=X peut générer des erreurs de compilation donc il est préférable de forcer le type à
pointeurs de int vu que M pointe sur une ligne complète. On peut écrire p=&M[0][0] */
for (i=0;i<m;i++)
{ printf("Donnez les elements de la ligne %d:\n",i);
for (j=0;j<n;j++)
scanf("%d",p+n*i+j);
printf("\n");}
for (i=0;i<m;i++)
{ printf("les elements de la ligne %d: sont ",i);
for (j=0;j<n;j++)
{ printf("%d ",*(p+n*i+j)); }
printf("\n"); }
} Fenineche Khadidja 29
3- Utilisation des pointeurs en langage C
C- Pointeurs et tableaux à deux dimensions
Remarque: Un tableau à deux dimensions est représenté de façon
continue en mémoire.
Si M est un tableau d’entiers de m ligne et n colonne, on peut
afficher par exemple ses éléments par:
For(i=0;i<m*n;i++) printf("%d ",*(p+i));
int X[m][n];
int *p; int i,j;
p=(int*)X;
for (i=0;i<m;i++)
{printf("Donnez les elements de la ligne %d:\n",i+1);
for (j=0;j<n;j++)
scanf("%d",p+n*i+j);
printf("\n");}
/* Affichage avec une seule boucle */
printf("les elements du tableau sont:\n ");
for (i=0;i<m*n;i++)
printf("%d \n ",*(p+i));
Fenineche Khadidja 30
3- Utilisation des pointeurs en langage C
C- Pointeurs et tableaux à deux dimensions
Utilisation d’une seule boucle pour la saisie et l’affichage des
éléments d’un tableau à deux dimensions en utilisant (/ et %):
#include <stdio.h>
#define m 2
#define n 3
int main()
{int X[m][n];
int *p; int i,j;
p=(int*)X;
printf("Donnez les elements du tableau\n",i+1);
for (i=0;i<m*n;i++)
{
printf("X[%d][%d]=",i/n,i%n);
scanf("%d",p+i);
printf("\n");}
for (i=0;i<m*n;i++)
printf("X[%d][%d]=%d\n",i/n,i%n,*(p+i));
}
Fenineche Khadidja 31
3- Utilisation des pointeurs en langage C
D- Tableaux de pointeurs
• Exemple:
char *M[3]={“admis", “redouble", “exclu”}; déclare et initialise un
tableau de 3 pointeurs sur des chaines constantes.
• On affiche le contenu comme suit:
int i; for (i=0; i<3; I++) printf("%s\n", M[i]);
• On accède à un élément j d’une chaine pointée par le ieme
pointeur par: M[i]+j et à son contenu par : *(M[i]+j)
M
‘a’ ‘d’ ‘m’ ‘i’ ‘s’ ‘\0’
M
‘a’ ‘d’ ‘m’ ‘i’ ‘s’ ‘\0’
Fenineche Khadidja 33
3- Utilisation des pointeurs en langage C
D- Tableaux de pointeurs #include <stdio.h>
#include <string.h>
• Solution de l’exercice: #define n 3
int main()
{int i,j;
char *M[]={"admis","redouble","exclu"};
/* Tri */
for (i=0;i<n-1;i++)
for (j=i+1;j<n;j++)
{char *c;
if (strcmp(M[i],M[j])>0)
{c=M[i];
M[i]=M[j];
M[j]=c;}
}
/* Affichage des chaines triées */
printf("\n");
for (i=0;i<n;i++) printf("%s \n",M[i]);
return 0;}
Fenineche Khadidja 34
Ressources bibliographiques