=ARRAYFORMULA(ROW(C:C))
will output row numbers like:
1
2
3
4
5
6
7
...
=ARRAYFORMULA(C:C<>"")
will output TRUE if cells in C column are not empty (otherwise) FALSE
TRUE
TRUE
TRUE
FALSE
TRUE
FALSE
FALSE
...
=ARRAYFORMULA(ROW(C:C)*(C:C<>""))
will do this (note that TRUE = 1 and FALSE = 0 in PC logic)
1 × TRUE = 1
2 × TRUE = 2
3 × TRUE = 3
4 × FALSE = 0
5 × TRUE = 5
6 × FALSE = 0
7 × FALSE = 0
... × ... = ...
=ARRAYFORMULA(MAX(ROW(C:C)*(C:C<>"")))
will output the highest number so in this case:
5
now INDEX is type of ARRAYFORMULA so this will work too:
=INDEX(MAX(ROW(C:C)*(C:C<>"")))
now we move MAX(...) part into 2nd INDEX argument which stands for row and as 1st argument we enter our range we want to map:
=INDEX(C:C, MAX(ROW(C:C)*(C:C<>"")))
this translates to:
=INDEX(C:C, 5)
which means: "return cell on 5th row in C column"
to answer your question why =ROW(C:C)*(C:C<>"") returns only single value - its because there is no command to process array so basically this is equal to:
=ROW(C1)*(C1<>"")
and result can be 0 or 1 - depends on if arguments are
TRUE × TRUE = 1
TRUE × FALSE = 0
FALSE × TRUE = 0
FALSE × FALSE = 0
and wrapping that into MAX is like having
=MAX(1)
or:
=MAX(0)