In reply to aehsan:
The type compatibility rules for an argument passed by reference is very strict. This is because any operation performed on the argument inside the routine is effectively being operated on the argument passed to the routine. You rarely need to pass an argument by reference unless you are calling a time-consuming task and need to have the argument updated while the task is blocked.
For your second question, arrays are aggregate data types and treated like a single object. So the entire array is passed as a single reference.