Pour développer un peu plus certaines des réponses ici...
En C, lorsqu'un identificateur de tableau apparaît dans un contexte autre que celui d'une opérande de & ou sizeof, le type de l'identificateur est implicitement converti de "tableau à N éléments de T" en "pointeur vers T", et sa valeur est implicitement fixée à l'adresse du premier élément du tableau (qui est la même que l'adresse du tableau lui-même). C'est pourquoi, lorsque vous passez simplement l'identifiant du tableau comme argument à une fonction, la fonction reçoit un pointeur vers le type de base, plutôt qu'un tableau. Puisqu'il est impossible de connaître la taille d'un tableau en regardant simplement le pointeur du premier élément, vous devez passer la taille comme un paramètre séparé.
struct Coordinate { int x; int y; };
void SomeMethod(struct Coordinate *coordinates, size_t numCoordinates)
{
...
coordinates[i].x = ...;
coordinates[i].y = ...;
...
}
int main (void)
{
struct Coordinate coordinates[10];
...
SomeMethod (coordinates, sizeof coordinates / sizeof *coordinates);
...
}
Il existe deux autres façons de transmettre des tableaux aux fonctions.
Il existe un pointeur sur un tableau de T, par opposition à un pointeur sur T. Vous déclareriez un tel pointeur sous la forme suivante
T (*p)[N];
Dans ce cas, p est un pointeur vers un tableau à N éléments de T (par opposition à T *p[N], où p est un tableau à N éléments de pointeur vers T). Vous pouvez donc passer un pointeur sur le tableau plutôt qu'un pointeur sur le premier élément :
struct Coordinate { int x; int y };
void SomeMethod(struct Coordinate (*coordinates)[10])
{
...
(*coordinates)[i].x = ...;
(*coordinates)[i].y = ...;
...
}
int main(void)
{
struct Coordinate coordinates[10];
...
SomeMethod(&coordinates);
...
}
L'inconvénient de cette méthode est que la taille du tableau est fixe, puisqu'un pointeur vers un tableau de 10 éléments de T est d'un type différent de celui d'un pointeur vers un tableau de 20 éléments de T.
Une troisième méthode consiste à envelopper le tableau dans un struct :
struct Coordinate { int x; int y; };
struct CoordinateWrapper { struct Coordinate coordinates[10]; };
void SomeMethod(struct CoordinateWrapper wrapper)
{
...
wrapper.coordinates[i].x = ...;
wrapper.coordinates[i].y = ...;
...
}
int main(void)
{
struct CoordinateWrapper wrapper;
...
SomeMethod(wrapper);
...
}
L'avantage de cette méthode est que vous n'avez pas à vous occuper des pointeurs. L'inconvénient est que la taille du tableau est fixe (encore une fois, un tableau de 10 éléments de T est un type différent d'un tableau de 20 éléments de T).