What is being passed is a pointer to the first element in the array. x is a pointer so you could have written line 1 as void hmm(int* x) with the exact same result.
As in your original example the array is passed by value then a copy of the address of the first element is created.
It is semantically equivalent to the statement
int *x = new int[4];
that is a copy of the address of the first element of unnamed array is assigned to x.
Take into account that if you have an array as for example
int a[4];
then using the name of an array as for example
*a = 10;
means that name a is implicitly converted to the address of the first element of the array. The same mechanism works then the name is passed to a function but in this last case a copy of the address of the first element of the array is created. So changing this copy does not change the original value of the array name.