Updating formal parameter doesn't affect actuals in calling procedure. Implement by copying. Calls to dotp copy 20 doubles Cannot affect calling environment directly. 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. Flexible, but potentially very confusing, and inefficient to implement.