The end objective of passing around arrays is...well...to use it at other code sites than the one it was created. So:
1. If you pass an array by allowing it to decay, the resulting "decayed" pointer is still a pointer to a valid memory location. Only thing that inhibits you from writing a regular for loop for iterating over arrays is that you don't know the size since that's lost in the decay. So an obvious workaround is to pass it in along with the pointer. That way, you have access to both the memory and the correct no. of elements to access. This is actually not that uncommon of a pattern in C (though not much in C++) where arrays are passed around in this manner.
2. If you pass in by reference, an obvious necessity is to hardcode the number of elements in the array explicitly because the target function signature needs that size. So that is a sort of a downside to passing by reference.
P.S. There is a way to fix 2 and allow passing arrays by reference without explicitly specifying the number of array elements by using templates but I'll leave it to you to explore it if you want to. Here's an example of all 3 versions
https://godbolt.org/z/j87j4P
I hope it makes sense now.