CHAPITRE 6�� LANGAGE DE � PROGRAMMATION: C
F. Karami
���� Les pointeurs
*
Programmer en langage C
2
Plan
1) Mémoire de l’ordinateur
2) Création, Définition, Déclaration et Initialisation d’un pointeur
3) Opérations élémentaires sur les pointeurs
4) Pointeurs et tableaux 1D et 2D
5) Arithmétiques des pointeurs
6) Allocation dynamique: Fonctions malloc et free
*
Programmer en langage C
3
1) La mémoire de votre ordinateur
*
Programmer en langage C
4
Les pointeurs
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
1000
1004
1008
1009
1010
1014
1018
Bus
Processeur
Mémoire(RAM)
Adresses
Un octet = 8 bits
rate
100
*
Programmer en langage C
5
Les pointeurs
2) Création, Définition, Déclaration et Initialisation d’un pointeur�
*
Programmer en langage C
6
Les pointeurs
*
Programmer en langage C
7
Les pointeurs
?
100
1001 1002 1003 1004 1005
p_rate
rate
1004
100
1001 1002 1003 1004 1005
p_rate
rate
Définition
*
Programmer en langage C
8
Les pointeurs
Déclaration
type *nom_du_pointeur ;
Exemple : int *p; float *p_float; char *p_char;
On dira que :p est un pointeur sur une variable du type int , ou bien p peut contenir l'adresse d'une variable du type int
*p est de type int, c’est l’emplacement mémoire pointé par p.
Initialisation
Son initialisation est une instruction de la forme : pointeur=&variable;
*
Programmer en langage C
9
Les pointeurs
la variable pointée par P */
pointé par P*/
*
Programmer en langage C
10
Les pointeurs
Exemple 1:
main(){
int v=12;
int u=10;
int *vP; /*pointeur sur int*/
vP = &v; /*affectation du pointeur */
u = *vP;
printf(“u=%d v=%d\n”,u,v);
*vP = 25;
printf(“u=%d v=%d\n”,u,v);
printf(“*vP=%d”,*vP);
}
*
Programmer en langage C
11
Les pointeurs
*
Programmer en langage C
12
Les pointeurs
Exemple 2 :
main( ){
float a , *ptr; /*supposons que ces variables sont représentées en
mémoire à partir de l’adresse 1000*/ �clrscr( ); // pour effacer l’écran<conio.h>
ptr = &a;
printf(‘’Entrer une valeur : ‘’);
scanf(‘’%f’’ , ptr); // on saisie la valeur 12.4
printf(‘’\n Adresse de a = %p Contenu de a = %f’’ ,ptr,*ptr);
*ptr += 0.4;
printf(‘’a = %f *p = %f ‘’, a,*ptr);
}
*
Programmer en langage C
13
Les pointeurs
3) Opérations élémentaires sur les pointeurs
*
Programmer en langage C
14
Les pointeurs
#include <stddef.h>
int *t, x , *r;
short y = 10 , *pt;
pt = &y;
t = NULL ; /* Correct */
t = 0 ; /* Correct */
x = 0 ;
t = x ; /* Incorrect ! bien que x vaille 0 */
r = &x ;
t = r ; /* Correct : t et r pointe sur des variables de même type*/
t = pt ; /* Incorrect : p et pt pointe sur des variable de type différent */
*
Programmer en langage C
15
Les pointeurs
Exercices
b) int x = 17 , *p = x; �*p = 17;
c) double *q;� int x = 17 , *p;
p = &x; � q =p;
d) int x, *p; &x = p;
*
Programmer en langage C
16
Les pointeurs
Exercices
b) int x = 17 , *p = x; *p = 17;
c) double *q; int x = 17 , *p;
p = &x; q =p;
d) int x, *p; &x = p;
*
Programmer en langage C
17
Les pointeurs
b) p = x est incorrect. Pour que p pointe sur x :p = &x
c) q = p incorrect. q et p deux
pointeurs sur des types différent
d)&x = p incorrect. &x n’est pas
une variable (lvalue) et par conséquent ne peut pas figurer à gauche d’une affectation.
4) Pointeurs et tableaux
*
Programmer en langage C
18
Les pointeurs
...
*
Programmer en langage C
19
Les pointeurs
Exemple ( Lecture et Affichage d’un tableau matérialisé par un pointeur)
#include <stdio.h>
#define N 10
main(){
float t[N] , *pt ;
int i ;
printf("Entrez %d entiers\n", N) ;
pt = &t[0] ; // ou pt = t
for (i = 0 ; i<N; i++)
scanf("%f", pt+i) ; // pt+i pointe sur t[i]
printf("\n Tableau lu : \n") ;
for (i = 0 ; i<N ; i++)
printf(« %f », *(pt+i)) ; // *(pt+i) équivalente à t[i]
}
*
Programmer en langage C
20
Les pointeurs
Exemple ( Lecture et Affichage d’un tableau matérialisé par un pointeur)
/* Autre Solution sans déclarer la variable i */
#include <stdio.h>
#define N 10
main(){
float T[N] , *pt ;
printf("Entrez %d entiers\n", N) ;
for (pt = T ; pt<T+N; pt++)
scanf("%f", pt) ;
printf("\nTableau lu : \n") ;
for (pt = T ; pt<T+N; pt++)
printf("%7.2f", *pt) ;
}
*
Programmer en langage C
21
Les pointeurs
Pointeurs et tableaux à deux dimensions
p pointe sur A[0][0] et * p désigne A[0][0]
p + 1 pointe sur A[0][1] et * ( p + 1 ) désigne A[0][1]
..
p + N pointe sur A[1][0] et * ( p + N ) désigne A[1][0]
p + N + 1 pointe sur A[1][1] et * ( p + N + 1 ) désigne A[1][1]
..
p + M * N-1 pointe sur A[M-1][N-1] et * ( p + M * N -1 ) désigne A[M-1][N-1]
*
Programmer en langage C
22
Les pointeurs
Exemple ( Lecture et Affichage d’une matrice matérialisé par un pointeur)
#define M 4
#define N 10
main(){
short A[M][N] ;
short *pt ;
int i, j ;
/* lecture d’une matrice */
pt = &A[0][0] ; /* ou bien pt = A[0] ; */
for (i = 0 ; i<M ; i++){
printf("\t ligne n° %d\n", i+1) ;
for (j = 0 ; j<N ; j++)
scanf("%i", pt + i * N + j ) ;
}
/* affichage d’une matrice */
for (i = 0 ; i<M ; i++) {
for (j = 0 ; j<N ; j++)
printf("%d", *( pt + i * N + j ) ) ;
printf("\n") ; }}
*
Programmer en langage C
23
Les pointeurs
5) Arithmétiques des pointeurs
*
Programmer en langage C
24
Les pointeurs
Arithmétiques des pointeurs
*
Programmer en langage C
25
Les pointeurs
Autres déclarations des pointeurs :
*
Programmer en langage C
26
Les pointeurs
Allocation dynamique
c’est l’allocation dynamique.
*
Programmer en langage C
27
Les pointeurs
*
Programmer en langage C
28
Les pointeurs
Fonctions malloc et free
*
Programmer en langage C
29
Les pointeurs
Fonctions malloc et free
*
Programmer en langage C
30
Les pointeurs
Exemple (Allocation dynamique, Saisie et Affichage d’un tableau )
#include <stdio.h>
#include <stdlib.h>
main(){
short *pt;
int N , i;
printf("Entrez la taille N du tableau \n") ;
scanf("%d", &N) ;
pt = ( short * ) malloc( N * sizeof( short ) );
if (pt == NULL)
printf("Mémoire non disponible") ;
*
Programmer en langage C
31
Les pointeurs
Exemple (Allocation dynamique, Saisie et Affichage d’un tableau )
printf("Saisie du tableau : ");
for ( i = 0 ; i < N; i++)
scanf("%d", pt + i ) ;
printf("Affichage du tableau ") ;
for ( i= 0 ; i < N; i++)
printf("%d\t", *( pt + i ) ) ;
free( pt );
}
*
Programmer en langage C
32
Les pointeurs
/* Déclaration d'un pointeur sur des entiers p et de la taille du tableau N */
int* p=NULL;
int N;
/* Saisie de la taille du tableau par l'utilisateur */
scanf ("%d",&N);
/* Allocation dynamique de la zone mémoire occupée par le tableau */
p = (int*)malloc (N*sizeof(int));
*
Programmer en langage C
33
Les pointeurs
Pointeurs et structures
Struct data {
int *valeur;
int *taux;
} premier;
*
Programmer en langage C
34
Les pointeurs
Pointeurs et structures
struct point{
int num;
float x;
float y;
};
*
Programmer en langage C
35
Les pointeurs
Pointeurs et structures
*
Programmer en langage C
36
Les pointeurs
Pointeurs et structures
int nombre;
char nom[10];
};
Nous pouvons déclarer un tableau appartenant au type part
Nous pouvons ensuite déclarer un pointeur vers une structure de
type part, et l’initialiser pour pointer sur la première structure du
tableau data:
Nous obtenons un tableau de structures de type part et un pointeur
vers le premier élément du tableau. On affiche le contenu du premier
élément avec l’instruction:
*
Programmer en langage C
37
Les pointeurs
Pointeurs et structures
#include<stdio.h>
#define max 4
struct part{
int nombre;
char nom[10];
}data[Max]={1,’’smith’’, 2, ‘’jones’’, 3, ‘’Adams’’, 4,’’Wilson’’};
struct part *p_part;
int count;
main(){
P_part=data;
for(count=0; count<Max ; count++){
printf(‘’A l’adresse %d : %d %s\n’’,p_part,(p_part+count)->nombre, ,(p_part+count)->nom);
// p_part++;
}
}
*
Programmer en langage C
38
Les pointeurs