Note au lecteur
Si la notion de pointeurs vous était nouvelle jusqu'ici, alors sautez les sections 9.4 et 9.5 de ce chapitre et les exercices correspondants. Traitez d'abord le chapitre suivant jusqu'à ce que les notions de pointeurs et d'adresses se soient bien consolidées.
Si nous avons besoin d'un ensemble de pointeurs du même type, nous pouvons les réunir dans un tableau de pointeurs.
Déclaration
Déclaration d'un tableau de pointeurs
<Type> *<NomTableau>[<N>] déclare un tableau <NomTableau> de <N> pointeurs sur des données du type <Type>.
Exemple
double *A[10];déclare un tableau de 10 pointeurs sur des rationnels du type double dont les adresses et les valeurs ne sont pas encore définies.
Remarque
Le plus souvent, les tableaux de pointeurs sont utilisés pour mémoriser de façon économique des chaînes de caractères de différentes longueurs. Dans la suite, nous allons surtout considérer les tableaux de pointeurs sur des chaînes de caractères.
Initialisation
Nous pouvons initialiser les pointeurs d'un tableau sur char par les adresses de chaînes de caractères constantes.
Exemple
char *JOUR[] = {"dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"};déclare un tableau JOUR[] de 7 pointeurs sur char. Chacun des pointeurs est initialisé avec l'adresse de l'une des 7 chaînes de caractères.
int I; for (I=0; I<7; I++) printf("%s\n", JOUR[I]);
Comme JOUR[I] est un pointeur sur char, on peut afficher les premières lettres des jours de la semaine en utilisant l'opérateur 'contenu de' :
int I; for (I=0; I<7; I++) printf("%c\n", *JOUR[I]);
L'expression JOUR[I]+J désigne la J-ième lettre de la I-ième chaîne. On peut afficher la troisième lettre de chaque jour de la semaine par:
int I; for (I=0; i<7; I++) printf("%c\n",*(JOUR[I]+2));
Résumons: Les tableaux de pointeurs
int *D[];
déclare un tableau de
pointeurs sur des éléments du type int
D[i] peut pointer
|
sur
des variables simples ou
| |
sur
les composantes d'un tableau.
| ||
D[i]
|
désigne
l'adresse contenue dans l'élément i de D
| |
(Les
adresses dans D[i] sont variables)
| ||
*D[i]
|
désigne
le contenu de l'adresse dans D[i]
|
Si D[i] pointe dans un tableau,
D[i]
|
désigne
l'adresse de la première composante
|
||
D[i]+j
|
désigne
l'adresse de la j-ième composante
|
||
*(D[i]+j)
|
désigne
le contenu de la j-ième composante
|
Considérez les déclarations de NOM1 et NOM2:
char *NOM1[] = {"Marc", "Jean-Marie", "Paul", "François-Xavier", "Claude" }; char NOM2[][16] = {"Marc", "Jean-Marie", "Paul", "François-Xavier", "Claude" };
a) Représenter graphiquement la mémorisation des deux variables NOM1 et NOM2.
b) Imaginez que vous devez écrire un programme pour chacun des deux tableaux qui trie les chaînes selon l'ordre lexicographique. En supposant que vous utilisez le même algorithme de tri pour les deux programmes, lequel des deux programmes sera probablement le plus rapide?
Ecrire un programme qui lit le jour, le mois et l'année d'une date au clavier et qui affiche la date en français et en allemand. Utiliser deux tableaux de pointeurs, MFRAN et MDEUT que vous initialisez avec les noms des mois dans les deux langues. La première composante de chaque tableau contiendra un message d'erreur qui sera affiché lors de l'introduction d'une donnée illégale.
Exemples:
Introduisez la date: 1 4 1993 Luxembourg, le 1er avril 1993 Luxemburg, den 1. April 1993 Introduisez la date: 2 4 1993 Luxembourg, le 2 avril 1993 Luxemburg, den 2. April 1993