Your confusion is because the assumption is incorrect, there is no pass-by-reference in C, only pass-by-value.
When arrays are passed as function argument, they are automatically converted to a pointer that points to their first element. It looks like pass-by-reference as you can modify what the pointer points, but it's not, it's still pass-by-value, the value of the pointer itself.
That means the function argument bitshp
is a new pointer, it's supposed to have a different address than the bitshp
outside the function. But they do share the same value.