Each actual argument is evaluated to a value before call. On entry, value is bound to formal parameter just like a local variable. Updating formal parameter doesn't affect actuals in calling procedure. Implement by copying. On entry, the formal is bound to the address, which must be dereferenced to get value, but can also be updated .
Accesses are slower.
Answer depends on what a record or array r-value is in a particular language. In Pascal, Ada, and similar languages, r-values of both arrays and records are the actual contents. So passing a record or array by value means copying the contents, whereas passing by reference doesn't. Approach is made more feasible because programmer doesn't have to worry about lifetime of heap data, due to automatic garbage collection. Clever compilers can decide whether smallish objects should be heap-allocated or manipulated directly.