Для прохождения любого массива типа T
к функции, обычно вы написать функцию, которая принимает указатель на T и отдельный параметр размера:
void foo(album *a, size_t size) { ... }
, к которому вы передать выражение массива и размер:
int main(void)
{
...
album all_album [N];
...
foo(all_album , sizeof all_album/sizeof *all_album)
...
}
исключением случаев, когда это операнд из sizeof
или унарный &
операторов, или строковым существо используемый для инициализации другого массива в объявлении, выражение типа «N-element array of T
» будет заменено выражением типа «pointer to T
», значением которого является адрес первого элемента массива.
IOW, когда вы пишете
foo(all_album, sizeof all_album/sizeof *all_album);
происходит несколько вещей.
Первый all_album
выражение заменяется выражением указателя, значение которого &all_album[0]
; поэтому тип a
в определении для foo
имеет тип album *
.
Выражение sizeof all_album
оценивает общее количество байтов в массиве. Поскольку all_album
является операндом оператора sizeof
, это не преобразован в выражение указателя.
Выражение sizeof *all_album
вычисляет число байтов в одного объекта типа album
. Так как это all_album
не операнда sizeof
(The *all_album
выражение является операнд), он сначала преобразуется в выражение типа «указатель на album
».Оператор *
применяется к этому выражению указателя, давая новое выражение типа album
, которое оценивается sizeof
.
sizeof all_album/sizeof *all_album
оценивается с присвоением элементов в массиве. Это значение передается как параметр size
в определении foo
.
Но оно было создано в другой функции. –