Cas des tableaux à une dimension
Puisque l'identificateur du tableau déclaré est un pointeur constant, il suffit de dire que l'on utilise un pointeur pour transmettre un paramètre de type ‘tableau' dans une fonction.
Nous supposons que les tableaux « a », « b » et « c » ont été déclarés comme :
int a[MAX], b[MAX], c[MAX];
Et que MAX soit déclaré comme :
#define MAX 10
au début du programme par exemple.
Ci-dessous des exemples de déclarations de l'en-tête d'une fonction qui attend des tableaux en paramètres formels :
void somme_vect(int v[MAX], v1[MAX], v2[MAX])
void somme_vect(int v[], v1[], v2[])
void somme_vect(int *v, *v1, *v2)
Toutes ces notations sont équivalentes pour l'en-tête.
Pour les tableaux à une seule dimension nous n'avons pas besoin de spécifier la valeur MAX.
Ensuite le bloc de la fonction est :
{
int i;
for (i=0;i<MAX;i++) // ici MAX est connue grâce à la pré-compilation
// cela n'a rien a voir avec le v[MAX] d'un
// des en-têtes proposés
{
v[i] = v1[i]+v2[i];
}
}
Nous n'avons pas besoin de connaître la taille d'un tableau à une dimension (un vecteur). Nous avons juste besoin de savoir où il se trouve.
En effet, nous vous rappelons que :
v[i] = v1[i]+v2[i]
*(v +i) = *(v1 + i)+ *(v2 +i)
C'est strictement la même chose (voir cours précédent sur les tableaux).
Ci-dessous , des exemples d'invocations de la fonction avec les tableaux en paramètres (en supposant que les tableaux « b » et « c » ont été correctement initialisés)
somme_vect( &a[0], &b[0], &c[0]);
somme_vect(a, b, c);
Nous remarquons au niveau des deux appels de la fonction "somme_vect" que par exemple "&a[0]" dans le premier et que "a" au niveau du deuxième appel correspondent à une valeur qui est un pointeur. Ce qui correspond à l'en-tête de la fonction que nous avons définie.
Quelle que soit l'utilisation dans la fonction, on transmet toujours l'adresse du 1er élément du tableau. Dans le corps de la fonction (le bloc), nous pouvons donc utiliser par exemple v[i_local] ce qui, nous l'avons vu, permet d'accéder au contenu de la case et de le modifier.
Puisque le paramètre formel "v" contient une copie de "a" le pointeur constant qui est l'adresse du début de la zone mémoire allouée au sein de fonction principale « main », nous modifions directement le tableau pointé par "a".