Чтобы немного расширить некоторые ответы здесь ...
В C, когда идентификатор массива появляется в контексте, отличном от операнда для & или sizeof, тип идентификатора неявно преобразуется из «N-элементного массива T» в «указатель на T», и его значение неявно устанавливается на адрес первого элемента в массиве (который совпадает с адресом самого массива). Вот почему, когда вы просто передаете идентификатор массива в качестве аргумента функции, функция получает указатель на базовый тип, а не на массив. Поскольку вы не можете определить размер массива, просто взглянув на указатель на первый элемент, вы должны передать размер в качестве отдельного параметра.
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);
...
}
Существует несколько альтернативных способов передачи массивов в функции.
Существует такая вещь, как указатель на массив T, в отличие от указателя на T. Вы бы объявили такой указатель как
T (*p)[N];
В этом случае p - это указатель на массив из N элементов из T (в отличие от T * p [N], где p - это массив N-элементных указателей на T). Таким образом, вы можете передать указатель на массив, а не указатель на первый элемент:
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);
...
}
Недостатком этого метода является то, что размер массива является фиксированным, поскольку указатель на массив из 10 элементов T отличается от указателя на массив из 20 элементов T.
Третий метод - обернуть массив в структуру:
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);
...
}
Преимущество этого метода в том, что вы не копаетесь в указателях. Недостатком является то, что размер массива является фиксированным (опять же, массив из 10 элементов T отличается от массива из 20 элементов T).