Vous êtes sur la page 1sur 27

Ecole supérieure de Technologie

Département de Génie Electrique

Partie 4

POINTEURS

Khalid SBAI – Cours D’Informatique


Ecole supérieure de Technologie
Département de Génie Electrique
11/09/2021
III. POINTEURS
Rappel sur les variables:
Une variable peut être représentée par une case de la
mémoire, qui contient la valeur d’une donnée.
int a;
a
……. …….

0xC1 0xC2 0xC3 0xC4


Mémoire centrale
Chaque variable est identifiée par:
 un nom avec lequel on accède à son contenu.
 une adresse attribuée par le système d'exploitation .
Khalid SBAI – Cours D’Informatique
Ecole supérieure de Technologie
Département de Génie Electrique
11/09/2021
III. POINTEURS (suite)
Définition
Un pointeur est une variable ou une constante qui
contient l'adresse d'une autre variable :
Déclaration
Type_donnee * Ident_ptr;
Exemple :
int * pA;
pA est une variable codé sur 4 octets (adressage 32 bits) et
contiendra l'adresse d'un entier.

Si un pointeur P contient l'adresse d'une variable A, on dit que


'P pointe sur A'.
Khalid SBAI – Cours D’Informatique
Ecole supérieure de Technologie
Département de Génie Electrique
11/09/2021
III. POINTEURS (suite)

Accès au contenu d'une variable

adressage direct adressage indirect

Accès au contenu par Accès au contenu à partir de


le nom de la variable l’adresse de la variable.

Pointeur

Khalid SBAI – Cours D’Informatique


Ecole supérieure de Technologie
Département de Génie Electrique
11/09/2021
III. POINTEURS (suite)
Accès au contenu d'une variable

Exemple:
contenu
int *pA , i, j;
int **ppA;
A010 j
i=10; A00C 10 i
A008 A00C pA
pA = &i;
A004 A00C ppA
ppA = (int**)pA; A000

Khalid SBAI – Cours D’Informatique


Ecole supérieure de Technologie
Département de Génie Electrique
11/09/2021
III. POINTEURS (suite)
Les pointeurs et les noms de variables ont le même rôle: Ils
donnent accès à un emplacement dans la mémoire interne de
l'ordinateur.

Il faut quand même bien faire la différence:

Un pointeur est une variable qui peut 'pointer' sur


différentes adresses.

Le nom d'une variable reste toujours lié à la


même adresse.

Khalid SBAI – Cours D’Informatique


Ecole supérieure de Technologie
Département de Génie Electrique
11/09/2021
III. POINTEURS (suite)
Représentation en mémoire
 Un pointeur est un entier.
 Contenant l’adresse de la variable pointée.
 Sa taille dépend du Microprocesseur.
 Comment varie la taille en mémoire d’un pointeur en fonction
du type pointé ?
char * pchar; Sur PC sous Win32 :
int * pint; toujours 32 bits.
double * pdouble;
printf("pchar :%d \n", sizeof(pchar));
printf("pint :%d \n", sizeof(pint)); Sur PC sous Win64 :
printf("pdouble :%d \n", sizeof(pdouble)); toujours 64 bits.

Khalid SBAI – Cours D’Informatique


Ecole supérieure de Technologie
Département de Génie Electrique
11/09/2021
III. POINTEURS (suite)
Opérateurs de base

Récupération d’adresse d’une Récupération de donnée d’une


variable avec L’opérateur "&" Variable avec L’opérateur "*"
("adresse de") ("contenu de")

int i, *pi;

pi =&i;
i = 1;
*pi = 2;

Khalid SBAI – Cours D’Informatique


Ecole supérieure de Technologie
Département de Génie Electrique
11/09/2021
III. POINTEURS (suite)
 Somme d’un pointeur et d’un entier


Lorsqu’on ajoute 1 à un pointeur,
cela augmente la valeur de l’adresse
A010 A000 T
qu’il contient non pas de 1, mais de
la taille d’un élément pointé.

 Intérêt :
 Si un pointeur pointe A012 T[3]
au début d’un tableau. A008 T[2]
A004 T[1]
A000 T[0]
Ajouter 1 fait pointer


sur l’élément suivant.
Khalid SBAI – Cours D’Informatique
Ecole supérieure de Technologie
Département de Génie Electrique
11/09/2021
III. POINTEURS (suite)
Exemple


int T[4] = {0, 10, 20, 30}; A010 A000 T
int* t;
t = &T[0];
printf("%d\n", *t);
t = t + 1;
printf("%d\n", *t); A012 T[3]
t = t + 1;
A008 T[2]
printf("%d\n", *t);
A004 T[1]
t = t + 1;
A000 T[0]
printf("%d\n", *t);


Khalid SBAI – Cours D’Informatique
Ecole supérieure de Technologie
Département de Génie Electrique
11/09/2021
III. POINTEURS (suite)
Somme d’un pointeur et d’un entier
Lorsqu’on ajoute "n" à un pointeur, cela augmente la valeur de
l’adresse de n fois la taille de l’élément pointé.

Lorsque le pointeur pointe sur un élément d’un tableau d’indice


m, il pointe ensuite sur l’élément d’indice m+n, lorsqu’on ajoute
"n"
Opérateurs combinés: +=
-=
Opérateurs d’incrémentation et de décrémentation
++ : le pointeur pointe sur l’élément suivant.
-- : le pointeur pointe sur l’élément précédent.

Khalid SBAI – Cours D’Informatique


Ecole supérieure de Technologie
Département de Génie Electrique
11/09/2021
IV. POINTEURS ET TABLEAUX
Tableaux à un 1 dimension et Pointeur

Soit un tableau T de type entier:


int T[10];
T[0] T[1] T[2] ……………. T[9]

T+i &T[i]
Pointeur tableau
*(T+i) T[i]

printf("%d",*T); ou printf("%d" ,T[0]);

scanf("%d" ,T+2); ou scanf("%d",&T[2]);

Khalid SBAI – Cours D’Informatique


Ecole supérieure de Technologie
Département de Génie Electrique
11/09/2021
IV. POINTEURS ET TABLEAUX
Tableaux à 1 dimension et Pointeur
Exemple1 Exemple2
main() main()
{ {
int T[5] = {-3, 4, 0, -7, 3}; int T[5] = {-3, 4, 0, -7, 3};
int A[5]; int A[5];
int I,J; int I,J;
for (J=0,I=0 ; I<5 ; I++) for (J=0,I=0 ; I<5 ; I++)
if (T[I]>0) if (*(T+I)>0)
{ {
A[J] = T[I]; *(A+J) = *(T+I);
J++; J++;
} }
return 0; return 0;
} }
Khalid SBAI – Cours D’Informatique
Ecole supérieure de Technologie
Département de Génie Electrique
11/09/2021
IV. POINTEURS ET TABLEAUX
Tableau à 2 dimension et Pointeurs
Soit le tableau M à deux dimensions défini comme suit:
int M[4][3] = { { 0, 1, 2},
{10,11,12},
{20,21,22},
{30,31,32}};
Le nom du tableau M représente l'adresse du premier élément
du tableau et pointe sur le tableau M[0] qui a la valeur:
{0,1,2}.

L'expression (M+1) est l'adresse du deuxième élément du


tableau et pointe sur M[1] qui a la valeur: {10,11,12}

Khalid SBAI – Cours D’Informatique


Ecole supérieure de Technologie
Département de Génie Electrique
11/09/2021
IV. POINTEURS ET TABLEAUX
Lecture et Affichage d’une matrice matérialisé par un pointeur

Exemple1 /* lecture d’une matrice */


pA = &A[0][0] ; /* ou bien pA = A[0] ; */
#include <stdio.h> for (i = 0 ; i<NL ; i++)
#define NL 4 { printf("\t ligne n° %d \n", i+1) ;
#define NC 10 for (j = 0 ; j<NC ; j++)
void main() scanf("%i", pA + i * NC + j ) ;
}
{ for (i = 0 ; i<NL ; i++)
short A[NL][NC] ; { for (j = 0 ; j<NC ; j++)
short *pA ; printf("%d ", *( pA + i * NC + j ) ) ;
int i, j ; printf("\n") ;
}
}

Khalid SBAI – Cours D’Informatique


Ecole supérieure de Technologie
Département de Génie Electrique
11/09/2021
IV. POINTEURS ET TABLEAUX
Allocation dynamique
2 types de données dans un programme :

Données statiques
On connaît à l'avance (lors de l'écriture du programme) la
taille des données. La mémoire peut être réservée à l'avance,
avant l'exécution du programme

Données dynamiques
On ne connaît la taille des données qu'à l'exécution du
programme la réservation de la mémoire se fait au cours
de l'exécution du programme

Khalid SBAI – Cours D’Informatique


Ecole supérieure de Technologie
Département de Génie Electrique
11/09/2021
IV. POINTEURS ET TABLEAUX
Allocation dynamique

La déclaration d’un tableau définit un tableau "statique": il


possède un nombre figé d’emplacements.
Il y a donc un gaspillage d’espace mémoire en
réservant toujours l’espace maximal prévisible.

Il serait souhaitable que l’allocation de la mémoire dépend


du nombre d’éléments à saisir. Ce nombre ne sera connu
qu’à l’exécution : c’est l’allocation dynamique.

Khalid SBAI – Cours D’Informatique


Ecole supérieure de Technologie
Département de Génie Electrique
11/09/2021
IV. POINTEURS ET TABLEAUX
Allocation dynamique
En C, il existe 4 fonctions pour gérer l’allocation dynamiquement
de la mémoire
Bibliothèque <stdlib.h>
char *malloc(taille) allocation d’un bloc
char *calloc(taille, sizeof(type)) allocation & initialisation d’un bloc
char *realloc(char *, taille) modification de la taille d’un bloc
void free(char *) libération d’un bloc

Chacune des fonctions malloc, calloc ou realloc, prend une zone


d’une taille donnée dans l’espace mémoire libre réservé pour le
programme (appelé tas ou heap) et affecte l’adresse du début de
la zone à une variable pointeur.

Khalid SBAI – Cours D’Informatique


Ecole supérieure de Technologie
Département de Génie Electrique
11/09/2021
IV. POINTEURS ET TABLEAUX
Allocation dynamique
malloc ( N):

Fournit l'adresse d'un bloc mémoire de N


octets libres ou la valeur zéro sinon.
(int *) malloc(N*sizeof(int)):

Fournit l'adresse d'un bloc mémoire de N


octets libres pour déposer des int, ou la valeur
zéro sinon.
Dynamiquement, N est du type unsigned int, donc on ne peut pas
réserver plus de 65536 octets à la fois
La fonction malloc retourne l’adresse du premier octet de la zone
mémoire allouée. En cas d’échec, elle retourne NULL.
Khalid SBAI – Cours D’Informatique
Ecole supérieure de Technologie
Département de Génie Electrique
11/09/2021
IV. POINTEURS ET TABLEAUX
Allocation dynamique
Utilisation des fonctions de la bibliothèque <stdlib.h>
(int *) malloc(N*sizeof(int)):

Fournit l'adresse d'un bloc mémoire de


N*taille de int libres pour déposer des int, ou
la valeur zéro sinon.
int * A;
A= (int *)malloc(N*sizeof(int)):

mémorisation dans A l’adresse retournée


par la fonction malloc.

Khalid SBAI – Cours D’Informatique


Ecole supérieure de Technologie
Département de Génie Electrique
11/09/2021
IV. POINTEURS ET TABLEAUX
Allocation dynamique

La commande exit
S'il n'y a pas assez de mémoire pour effectuer une action avec
succès:
il est conseillé d'interrompre l'exécution du
programme et de renvoyer une valeur différente
de zéro comme code d'erreur du programme

Appel
Commande: exit( 1 )
de la bibliothèque <stdlib.h>

Khalid SBAI – Cours D’Informatique


Ecole supérieure de Technologie
Département de Génie Electrique
11/09/2021
IV. POINTEURS ET TABLEAUX
Allocation dynamique
Si on n’a plus besoin d’un bloc de mémoire réservé
dynamiquement par malloc, alors on peut le libérer à
l’aide de la fonction free.

free(nom_pointeur);

Libère le bloc de mémoire désigné par le pointeur


nom_pointeur

Khalid SBAI – Cours D’Informatique


Ecole supérieure de Technologie
Département de Génie Electrique
11/09/2021
IV. POINTEURS ET TABLEAUX
Allocation dynamique

101 20 int i=20;


102 205
int  p;

p = (int )malloc(sizeof(int));
 P =4;
205 4

Khalid SBAI – Cours D’Informatique


Ecole supérieure de Technologie
Département de Génie Electrique
11/09/2021
IV. POINTEURS ET TABLEAUX
Allocation dynamique

101 20 int i=20;


102 205
int  p;

p = (int )malloc(3  sizeof(int));


 P =4
205 4
(p+1)=14;
14

Khalid SBAI – Cours D’Informatique


Ecole supérieure de Technologie
Département de Génie Electrique
11/09/2021
IV. POINTEURS ET TABLEAUX Allocation dynamique
Cas d’un tableau à 1 dimension
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
(suite)
int main() printf("Saisie du tableau : \n");
{ int *T; for ( i = 0 ; i < N; i++)
int N , i; scanf("%d", T + i ) ;
printf("Entrez la taille N du tableau \n") ; printf("Affichage du tableau:\n");
scanf("%d", &N) ; for ( i= 0 ; i < N; i++)
T = ( int* ) malloc(N*sizeof( int) ); printf("%d\t", *( T + i ) ) ;
if (T == NULL) free( T );
{ return 0;
printf("Mémoire non disponible") ; }
getch();
exit( 1);
}
Khalid SBAI – Cours D’Informatique
Ecole supérieure de Technologie
Département de Génie Electrique
11/09/2021
IV. POINTEURS ET TABLEAUX
Allocation dynamique
Cas d’un tableau à 2 dimensions
Pour allouer dynamiquement de la mémoire à un tableau de 15
lignes et 20 colonnes on procède ainsi:

int ** A;
A = (int **)malloc(15*sizeof(int *));
for (int i=0; i<15; i++)
A[i] =(int *) malloc(20*sizeof(int));

Pour libérer les espaces inutiles


for (i=0; i<15; i++)
Ou free(A);
free(A[i]);
Khalid SBAI – Cours D’Informatique
Ecole supérieure de Technologie
Département de Génie Electrique
11/09/2021

FIN

Khalid SBAI – Cours D’Informatique

Vous aimerez peut-être aussi