I have two confusions here.
1) The function is taking an array of struct(movies_t) as input, but the function declaration is like that it is taking a normal object/variable of type movies_t.
void printmovie (movies_t movie);
Should it not be declared as
void printmovie (movies_t movie[]);
with brackets?
2) Also when the function is called from the main, the following statement is used
No, printmovie() is printing a single movie so the example is correct. Notice on line 30 in your post how it is being called within the loop and is using a single instance (films[n]).
should it not be instead printmovie (films);
as brackets "[]" are optional here?
No without the brackets here you would be trying to send the address of the entire array to the function not a single instance. And no the brackets are necessary because this function is printing a single instance not the entire array.