Exercice 38
Énoncé
Soit le tableau t déclaré ainsi :
float t[3] [4] ;
Écrire les (seules) instructions permettant de calculer, dans une variable nommée som,
la somme des éléments de t :
a. en utilisant le « formalisme usuel des tableaux à deux indices » ;
b. en utilisant le « formalisme pointeur ».
a. La première solution ne pose aucun problème particulier :
int i, j ;
som = 0 ;
for (i=0 ; i<3 ; i++)
for (j=0 ; j<4 ; j++)
som += t[i] [j] ;
b. Le formalisme pointeur est ici moins facile à appliquer que dans le cas des tableaux
à un indice. En effet, avec, par exemple, float t[4], t est de type int * et il correspond
à un pointeur sur le premier élément du tableau. Il suffit donc d’incrémenter
convenablement t pour parcourir tous les éléments du tableau.
En revanche, avec notre tableau float t [3] [4], t est du type pointeur sur des
tableaux de 4 flottants (type : * float[4]). La notation *(t+i) est généralement
inutilisable sous cette forme puisque, d’une part, elle correspond à des valeurs de
tableaux de 4 flottants et que, d’autre part, l’incrément i porte, non plus sur des
flottants, mais sur des blocs de 4 flottants ; par exemple, t+2 représente l’adresse du
huitième flottant, compté à partir de celui d’adresse t.
Une solution consiste à « convertir » la valeur de t en un pointeur de type float *. On
pourrait se contenter de procéder ainsi :
float * adt ;
.....
adt = t ;
En effet, dans ce cas, l’affectation entraîne une conversion forcée de t en float *, ce
qui ne change pas l’adresse correspondante (seule la nature du pointeur a changé).
83
Énoncé
Soit le tableau t déclaré ainsi :
float t[3] [4] ;
Écrire les (seules) instructions permettant de calculer, dans une variable nommée som,
la somme des éléments de t :
a. en utilisant le « formalisme usuel des tableaux à deux indices » ;
b. en utilisant le « formalisme pointeur ».
a. La première solution ne pose aucun problème particulier :
int i, j ;
som = 0 ;
for (i=0 ; i<3 ; i++)
for (j=0 ; j<4 ; j++)
som += t[i] [j] ;
b. Le formalisme pointeur est ici moins facile à appliquer que dans le cas des tableaux
à un indice. En effet, avec, par exemple, float t[4], t est de type int * et il correspond
à un pointeur sur le premier élément du tableau. Il suffit donc d’incrémenter
convenablement t pour parcourir tous les éléments du tableau.
En revanche, avec notre tableau float t [3] [4], t est du type pointeur sur des
tableaux de 4 flottants (type : * float[4]). La notation *(t+i) est généralement
inutilisable sous cette forme puisque, d’une part, elle correspond à des valeurs de
tableaux de 4 flottants et que, d’autre part, l’incrément i porte, non plus sur des
flottants, mais sur des blocs de 4 flottants ; par exemple, t+2 représente l’adresse du
huitième flottant, compté à partir de celui d’adresse t.
Une solution consiste à « convertir » la valeur de t en un pointeur de type float *. On
pourrait se contenter de procéder ainsi :
float * adt ;
.....
adt = t ;
En effet, dans ce cas, l’affectation entraîne une conversion forcée de t en float *, ce
qui ne change pas l’adresse correspondante (seule la nature du pointeur a changé).
83
