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
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
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
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
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
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
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
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
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

Ch5-les tableaux et les pointeurs.pdf

  • 1.
    1 Algorithmique & structures dedonné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 Typessimples 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 à unedimension: 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 à unedimension: 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 à deuxdimensions: 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 à deuxdimensions: 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