For passing any array of type T to a function, you generally write a function that accepts a pointer to T and a separate size parameter:
void foo(album *a, size_t size) { ... }
to which you pass the array expression and a size:
int main(void)
{
...
album all_album [N];
...
foo(all_album , sizeof all_album / sizeof *all_album )
...
}
Except when it is the operand of the sizeof or unary & operators, or is a string literal being used to initialize another array in a declaration, an expression of type "N-element array of T" will be replaced with an expression of type "pointer to T" whose value is the address of the first element of the array.
IOW, when you write
foo(all_album, sizeof all_album / sizeof *all_album);
several things happen.
The first all_album expression is replaced with a pointer expression whose value is &all_album[0]; this is why the type of a in the definition for foo has type album *.
The sizeof all_album expression evaluates to the total number of bytes in the array. Since all_album is an operand of the sizeof operator, it is not converted to a pointer expression.
The sizeof *all_album expression evaluates to the number of bytes in a single object of type album. Since all_album is not an operand of sizeof (the expression *all_album is the operand), it is first converted to an expression of type "pointer to album". The * operand is applied to that pointer expression, yielding a new expression of type album, which is evaluated by sizeof.
sizeof all_album / sizeof *all_album is evaluated, yielding the number of elements in the array. This value is what gets passed as the size parameter in the definition of foo.