It's a straight forward rule but first thing arrays and pointers are not same. Array decays to pointer when they are passed to the functions or when they are assigned to pointers e.g.
int *ptr = arr; // decay happens and ptr actually geys the address of first element i.e &arr
A 2D array like int arr when passed to a function will decay to
int (*ptr) i.e looses it's row size information.
int (*ptr) != int *ptr (this array of 20 pointers to int while the former is a pointer to an array of 20 ints.
A 3D array int arr decays to int (*ptr);
I don't know what else to explain. Probably you may ask questions and i'll try to explain if i know :)
When a N Dimension array is passed to a function it loose 1 dimension and decays to N-1 dimension.
So the array you passed is decayed to a pointer, and sizeof(pointer) is usually 8 bytes on a 64 bit machine.
This also happens when you assign an array to a pointer
int *ptr = arr; // decay happens and is actually &arr i.e the address of first element
That is why it is recommended to pass the size of the array as an explicit parameters.