Guide Final de rédaction de mémoire de fin d'étude
Ch5-les tableaux et les pointeurs.pdf
1. 1
Algorithmique & structures
de données I
1ère IAG
Responsable : Dr. Fadoua Bouafif
Chapitre 5
Les tableaux & les pointeurs
2
Objectifs
Définir un tableau à une dimension
Définir un tableau à deux dimensions
Manipuler les deux types de tableaux
Savoir la définition et la déclaration d’un pointeur
Apprendre la manipulation des pointeurs sur les tableaux
ASD I
3
Plan
1.Introduction
2.Définitions
3.Tableaux à une dimension
Définition
Manipulation
Activité
4.Tableaux à deux dimensions
Définition
Manipulation
Activité
5.Les pointeurs
définition
Déclaration
Affectation
Pointeur et tableau
6.Conclusion
4
ASD I
1 2
3 4
2. Introduction
Types de données
5
Types simples Types composés
ASD I
entier réel caractère
… Tableau Enregistrement listes
…
Tableau: définition
Un tableau est une structure de données qui sert à stocker, dans une même variable, un
nombre fini d'éléments de mêmes type.
Un tableau est un espace mémoire contigu, alloué en mémoire centrale, qui permet de stocker
« n » information de même type.
Une case représente un élément du tableau caractérisée par une valeur et un indice
précisant sa position au sein de l'ensemble.
L'indice début d'un tableau commence obligatoirement par 0 dans le langage C. En
algorithmique, l'indice peut être 0 ou 1 selon la convention adoptée.
Il y a deux types de tableaux : tableau à une dimension et tableau à deux dimensions
6
ASD I
5 6 20 … 10 ..
bsup
binf
Une case
n= bsup-binf+1
Tableau à une dimension: déclaration
Un tableau est caractérisé par :
Nom: représente où se trouve le 1er élément, càd l'adresse du 1er élément (nommé pointeur).
Taille: représente le nombre d'éléments qu'il contient.
Type: représente le type des éléments qu'il contient.
7
ASD I
Tableau à une dimension : Exemple
Exemple:
Soit un tableau à une dimension à 5 cases:
Une case i correspond à l'élément numéro i d’indice i-1
Exemple: La valeur 75 correspond à l’élément de la case 3 d’indice 2
8
ASD I
66 33 75 12 99
Indice: 0 1 2 3 4
case1 case2 case3 case4 case5
5 6
7 8
3. Tableau à une dimension:
déclaration en Algorithmique
9
ASD I
Utilisation du type Tableau Syntaxe 1
var : nom_tableau : tableau [indice_deb . . indice_fin] de type
Exemple:
var : A : tableau [0 .. 49] d'entier
Construction d’un
nouveau type
Syntaxe 2
type nom_type: tableau [indice_deb . . indice_fin] de type
var : nom_tableau : nom_type
Exemple:
type Tab : tableau [0 .. 49] d'entier
var : A : Tab
Le nouveau type identifié par nom_type s'ajoute à la liste des types, qui peuvent être utilisés dans l'algorithme et qui
contient la définition de ce type.
Tableau à une dimension: déclaration en C
Syntaxe
Type_de_données Nom_tableau[dimension] ;
Exemples:
int A [50] ; /* tableau de 50 valeurs de type entier*/
float notes [20] ; /* tableau de 20 valeurs de type réelle*/
int tab [15] ; /* tableau de 15 valeurs de type entier*/
char t [5] ; /* tableau de 5 valeurs de type caractère*/
ASD I
10
Tableau à une dimension: Manipulation
11
ASD I
L’initialisation d’un élément du tableau se fait comme suit :
L'accès à une case du tableau est direct et se fait via le numéro (indice) de la case
correspondante.
T[i] : désigne le contenu de la case numéro i+1 du tableau T.
Exemple:
A[3] : désigne le 4ème élément du tableau A.
A[3] = 22
Une case du tableau joue le rôle d’une variable
En Algorithmique En C
Nom_tableau[Indice] expression Nom_tableau[Indice] = expression
Tableau à une dimension: Manipulation (suite)
12
ASD I
Pour lire ou écrire un tableau T de N éléments, on utilisera les boucles:
En algorithmique En C
Lecture Pour i de 1 à N Faire
Ecrire(" Entrer l’élément ", i)
Lire (T[i])
FinPour
For(i=0;i<=N; i++ )
{
printf(" Entrer l’élément %d", i)
scanf(″%d″,&T[i]) ;
}
Ecriture Pour i de 1 à N Faire
Ecrire (T[i])
FinPour
For(i=0;i<=N; i++ )
{
printf(″T[%d]=%d″,i, T[i]) ;
}
9 10
11 12
4. Tableau à une dimension: Remarque en C
13
ASD I
Un tableau peut être initialisé dès la déclaration :
Syntaxe:
Type_de_données nom_Tableau[dimension] = {case1, ..., case-n} ;
Exemples:
int tab[5] = {10, 20, 0, 3, 5} ; // déclaration d’un tableau de 5 cases d’entiers
int tab[5] = {10, 20} ; // le reste des valeurs sont initialisées à zéro
int tab[] = {10, 20, 0, 3, 5} ; /*la taille du tableau est déterminée par le compilateur par le nombre de
valeurs énumérées dans l'initialisation */
int tab[4] ={0} ; //toutes les cases du tableau seront initialisées à 0
#define n 10
int tab[5] = {2*n-1, n-1, n, n+1, 2*n+1} ;
Tableau à une dimension: Activité
Ecrire un Algorithme (programme C) qui permet de déterminer, à partir de 20 notes
d’étudiants (fournies en données), combien d'entre elles sont supérieures à la moyenne de
la classe.
Solution
14
ASD I
Tableau à deux dimensions
Exemple:
Soit un tableau à deux dimensions de 4 Colonnes et 2 lignes :
Une case i,j correspond à l'élément de la ligne i+1 et de la colonne j+1.
Exemple: la case(1,2) correspond à l’élément de la 2ème ligne et 3ème colonne
15
ASD I
Case 0,0 Case0,2
Case1,1 Case1,3
Indice i 0 1 2 3
j
0
1
Tableau à deux dimensions:
déclaration en Algorithmique
16
ASD I
Utilisation du type Tableau Syntaxe
var : nom_tableau: tableau [indice_ligne_deb .. indice_ligne_fin,
indice_colonne_deb .. indice_colonne_fin] de type
Exemple:
var : A : tableau [0 .. 49, 0..29] d'entier
Construction d’un
nouveau type
Syntaxe
type nom_type: tableau [indice_ligne_deb .. indice_ligne_fin,
indice_colonne_deb .. indice_colonne_fin] de type
var : nom_tableau : nom_type
Exemple:
type Tab : tableau [0 .. 49, 0 .. 29] d'entier
var : A : Tab
13 14
15 16
5. Tableau à deux dimensions: déclaration en C
Syntaxe:
Type_de_données nom_tableau [nombre de lignes] [nombre de colonnes] ;
Exemples:
int A [50][30]; // déclaration d’un tableau de 50 lignes et 30 colonnes de type entier
float [20][20] ; // déclaration d’un tableau de 20 lignes et 20 colonnes de type entier
ASD I
17
Tableau à deux dimensions: Manipulation
18
ASD I
Les cases du tableau à 2 dimensions sont accessibles via le nom du tableau, l'indice de la
ligne et l'indice de la colonne.
Les indices de la ligne et de la colonne ne doivent pas dépasser les intervalles déclarés.
Désigne la case de la ligne i+1 et de la colonne j+1 du tableau T
Exemple:
En algorithmique En C
T[i, j] T[i][j];
En algorithmique En C
T : Tableau [0..9, 0..1] de réel
T[2, 1]
float T[10][2] ;
T[2][1];
désigne la case de la ligne 3 et de la colonne 2 du tableau T.
Une case d'un tableau joue le rôle d'une variable
Tableau à deux dimensions : Manipulation (suite)
19
ASD I
Pour lire ou écrire une matrice M d’ordre Nb_lig x Nb_col, on utilisera les boucles:
En algorithmique En C
Lecture Pour i de 1 à Nb_lig Faire
Pour j de 1 à Nb_col Faire
Ecrire(" Entrer l’élément ", i,j)
Lire (T[i,j])
FinPour
FinPour
For(i=0;i<=Nb_lig; i++ )
{
For(j=0;j<=Nb_col; j++ )
{
printf(" Entrer l’élément M[%d][%d] ", i,j)
scanf(″%d″,&T[i][j]) ;
}
}
Ecriture Pour i de 1 à Nb_lig Faire
Pour j de 1 à Nb_col Faire
Ecrire (T[i,j])
FinPour
FinPour
For(i=0;i<=Nb_lig; i++ )
{
For(j=0;j<=Nb_col; j++ )
{
printf(″M[%d][%d]=%d″, i, j, T[i][j]) ;
Tableau à deux dimensions : Remarque en C
20
ASD I
Un tableau à deux dimensions peut être initialisé dès la déclaration :
Les valeurs sont initialisées ligne par ligne de gauche à droite.
Les composantes de chaque ligne du tableau sont comprises entre accolades.
Pour améliorer la lisibilité des programmes, les composantes peuvent être indiquées sur
plusieurs lignes.
Exemple:
float notes[2] [2] = {{12, 13}, {9, 11}} ;
Ou
float notes[2] [2] = {{12, 13},
{9, 11}} ;
17 18
19 20
6. Tableau à deux dimensions: Activité
Ecrire un Algorithme (programme C) qui permet de remplir une matrice M d’entier de L lignes
et C colonnes et d’afficher la valeur maximum de ses éléments . N.B 0< C<=20, 0< L<=20
Solution
21
ASD I
Les pointeurs: définition
Un pointeur est une variable dont la valeur est une adresse.
Une variable pointée est une variable dont l’adresse est contenue dans un
pointeur.
22
x
Variable pointée
pt
Pointeur
L’adresse de x
Les pointeurs: Déclaration
Un pointeur est une variable qui a le même type que la variable qu'il pointe
donc il doit être déclaré.
En algorithme: la déclaration est faite avec puis le type du pointeur.
En C: l'opérateur d'indirection * (astérisque) est utilisé pour définir un pointeur.
Syntaxes
Exemples : si la variable pointée est de type entier, alors le pointeur est de type entier aussi.
23
En Algorithme En C
nom_pointeur : ↑ type type *nom_pointeur ;
En Algorithme En C
var: x: entier
px: ↑ entier
{
int x;
int *px;
}
Remarque EN C
L'accès à la variable pointée peut être fait :
- Directement à travers le nom de la variable (x)
- Indirectement à travers le pointeur sur cette variable (*px)
Donc x (*px)
(*px) représente le contenu de la variable pointée par px
24
21 22
23 24
7. Les pointeurs: affectation
Pour affecter l'adresse d'une variable à un pointeur, il faut utiliser les instructions suivantes:
Syntaxes:
Exemples :
25
En Algorithme En C
nom_pointeur ↑ nom_variable nom_pointeur = & nom_variable;
En Algorithme En C
var: x: entier
px: ↑ entier
Debut
px ↑ x
{
int x;
int *px;
px =&x;
}
- Si on affiche le contenu d'un pointeur, alors l’adresse de la variable pointée sera affichée.
- Si on affiche le contenu d'une variable pointée, alors la valeur associée à cette variable sera affichée. L'accès au
contenu de cette variable pointée s'appelle déréférencement.
Remarques
1. Si le contenu d'une variable pointée est modifié, l'adresse du pointeur n'est pas modifiée.
Exemples:
26
int i=12; i est une variable de type entier
int *adr; *adr est un pointeur de même type que i
adr =&i; adr pointe sur i
*adr =30; i prendra la valeur 30
(*adr) = i; : (*adr) désigne la valeur de i.
Exemple
27
#include <stdio.h>
Void main( )
{
int i = 3;
int *P, *Z ; // P et Z sont des pointeurs sur une variable de type entier
P=&i; //P contient l’adresse de la variable i
Z=P;
printf (" le contenu de la case mémoire pointée par P est : %d ”, *P); // *P=3
*P = 5;
printf (”n i = %d et *Z = %d ”, i, *Z) ; // i=5 et *Z=5
}
Les objets i et *P sont identiques
Ils ont les mêmes adresse et
valeur.
La modification de *P modifie i.
Remarques
2. Lorsque le pointeur ne reçoit aucune adresse, il se pointe sur nulle.
Si vous déclarez un pointeur sans l’initialiser, alors lorsque vous tentez de l’utiliser, le
programme se plante. Pour éviter cela, le pointeur doit être initialisé à NIL (en C, NULL)
3. Les opérations possibles sur les pointeurs:
Affectation entre les variables pointeurs de même type.
Comparaison de pointeurs de même types en utilisant les opérateurs de comparaisons.
NIL : Not Identified Link
28
25 26
27 28
8. Pointeurs & Tableaux
L'utilisation des pointeurs vers des tableaux est très courante en C.
Il existe une relation importante entre un pointeur et un tableau du fait que toute
opération manipulant des indices de tableaux peut être faite à l’aide de pointeurs.
Les pointeurs vers les tableaux conduisent généralement à des programmes qui
s'exécutent plus rapidement et consomment moins d'espace mémoire.
En C, le compilateur convertit toujours une référence à un tableau en un pointeur sur
le début du tableau.
29
Pointeurs vers tableaux
30
Exemple:
int tab[ 100 ] ; // un tableau tab de 100 entiers
int *ptrtab ; // un pointeur ptrtab sur le type entier
ptrtab=tab; ptrtab= &tab[0] ;
ptrtab pointe sur le premier élément du tableau
ptrtab contient l’adresse du premier élément du tableau (& tab[0] )
Le nom du tableau (tab) sans indice est considéré comme un pointeur vers l’ensemble du
tableau
Pour définir un pointeur destiné à référencer les éléments d'un tableau, il faut définir un pointeur sur le
type des éléments du tableau et non pas directement vers le tableau.
Pointeurs vers tableaux (suite)
31
Exemple:
int tab[ 100 ] ; // un tableau tab de 100 entiers
int *ptrtab ; // un pointeur ptrtab sur un entier
*(ptrtab+5)=10; tab[5]=10; //affecter à la 6ème case du tableau la valeur 10
ptrtab= &tab[1] // ptrtab pointe sur le second élément du tableau
Pour accéder à une autre valeur du tableau , il suffit d'ajouter son indice au pointeur de base
et d'appliquer l'opérateur d'indirection:
*(ptrtab + i) tob[i] ptrtab[i]
Pointeurs vers tableaux (suite)
32
Le pointeur peut être utilisé comme un indice de parcours dans le tableau.
Exemple: Si ptrtab pointe sur la case i
Ptrtab +=1 ou ++ptrtab référence la case suivante (i + 1) et
Ptrtab -=1 ou --ptrtab référence la case précédente (i - 1)
Attention: Lors de l'utilisation de ces opérateurs, il faut veiller à ne pas être en dehors du tableau, que
ce soit au début ou à la fin sinon ça sera une erreur de débordement Il faut toujours contrôler le
programme pour éviter cette situation.
Comparaison de deux pointeurs, en C : il est utile de comparer deux pointeurs vers un même
tableau, par exemple :
ptrtab >&tab[99]; le résultat est vrai si le pointeur dépasse le dernier élément, sinon c’est faut.
ptrtab>&tab[99] ; ptrtab > Tab + 99; //Tab est un pointeur vers le début du tableau.
29 30
31 32
9. Pointeurs vers tableaux (suite)
33
Soustraction de deux pointeurs de même types: cette opération fournit le nombre d'éléments
contenus entre les deux pointeurs.
Exemple: int tab[100], *a, *b, x;
a =&tab[5] ; // a pointe sur le 6ème élément du tableau
b=&tab[20] ; // b pointe sur 21ème élément du tableau
x = b - a ; // x= 15, le nombre des éléments qui sépare les deux pointeurs
34
► Si p pointe vers un élément dans un tableau T, l'instruction n = p - T; affecte à n le numéro
d'indice de l'élément du tableau T vers lequel pointe p.
► Si p’ pointe vers le dernier élément de T (p’ = & T[99];) alors, n va avoir la valeur 99 après la
soustraction.
T
0 … 25 …. 99
p
n = p - T; // n= 25
p’
n = p’ - T; // n= 99
Pointeurs vers tableaux (suite)
Pointeurs vers tableaux: activité
35
Ecrire un programme en C qui permet d’afficher le contenu du tableau en utilisant un pointeur :
Conclusion
36
Dans ce chapitre nous avons:
Définie et manipulé les tableaux à une dimension et à deux
dimensions en algorithmique et en C
Définie un pointeur
Appris la manipulation des pointeurs sur les tableaux
33 34
35 36