TD 6 : Tableaux - Questions/réponses

Exercice 6.1 : Somme de deux tableaux

Solution avec notation des pointeurs

by Amine Brikci-Nigassa -
Number of replies: 0

Les tableaux ne sont pas des pointeurs, mais quand on écrit le nom d'un tableau dans une expression, le compilateur le traduit par l'adresse du premier élément de ce tableau.

En particulier, quand on appelle une fonction en lui donnant comme paramètre effectif un tableau, la valeur qui est transmise à la fonction au moment de l'appel est donc l'adresse du premier élément du tableau. Comme le paramètre effectif est la valeur qui est affectée à ce moment au paramètre formel (qui est une variable locale à la fonction), et comme on ne peut rien affecter à une variable de type tableau (on ne peut affecter des valeurs qu'à ses éléments), les paramètres formels déclarés dans une fonction ne sont pas vraiment de type tableau (comme peuvent le faire croire les crochets [] qui les suivent), mais plutôt de type pointeur, pour pouvoir recevoir l'adresse transmise.

On peut remplacer les paramètres « tableaux » d'une fonction qui sont écrits en utilisant la notation des crochets (exemple : int t[100]) par des pointeurs (int * t), de toute façon le compilateur le fait toujours automatiquement en traduisant (cela explique pourquoi on peut laisser les crochets vides :int t[]). La fonction de la solution précédente pourra donc être écrite :

void som2tab(int *tab1, int *tab2, int *somme, int taille)
{
for (int i=0 ; i<taille ; ++i) somme[i] = tab1[i] + tab2[i]; }

tab1, tab2 et somme sont des pointeurs. Ils l'étaient déjà dans la solution précédente puisque cette écriture est strictement équivalente. Cependant ils sont utilisés dans la boucle comme si c'était des tableaux, avec la notation des crochets. En effet, il ne faut pas croire que cette notation n'est utilisable qu'avec les tableaux : ce n'est que du sucre syntaxique que le compilateur traduit automatiquement par la notation des pointeurs. Par exemple, l'expression t[i] est toujours traduite par le compilateur comme *(t+i) et cela est vrai que t  soit un tableau ou un pointeur (si c'est un pointeur, c'est l'adresse qu'il contient qui est utilisée pour le calcul, si c'est un tableau, c'est l'adresse du premier élément du tableau, comme nous l'avons dit plus haut).

Voici enfin une version modifiée de la fonction où la boucle n'utilise pas la notation des crochets :

void som2tab(int *tab1, int *tab2, int *somme, int taille){
    for (int *p=somme ; p-somme<taille ; ++p)
        *p = *tab1++ + *tab2++;
}