Retourner par référence, ça sort d'ou? Soit la fonction retourne un tableau, soit elle modifie un tableau passé en argument par référence.
En passant l'argument par référence on lui passe l'adresse du tableau donc si le tableau est modifié dans la fonction c'est bel et bien le tableau qui est modifié car il n'y a pas de copie locale.
#include <stdio.h>
void foo (char *bar, int n)
{
int i;
for (i=0; i<n; i++)
bar[i]=i+10;
}
int main()
{
char tab[256];
int n=3, i;
foo(tab, n); // remplit le tableau
// regarde son contenu
for (i=0; i<n; i++)
printf("%d %d\n", i, tab[i]);