Quick answer: Arrays are always passed by reference (pointer).
Common Lisp generally tries to pass parameters by reference, except things that are small enough to fit into a single CPU register (FIXNUMs etc). Lisp "tries" means that the details are implementation dependent (and hardware dependent too), but you can be sure that every existing Common Lisp implementation will try to produce as little memory overhead as possible, because otherwise the execution speed would become very slow.
There was a very similar discussion a few years ago under Passing values by reference
with some more detailed explanations.
By using COPY-SEQ
you can pass arrays by value. But if you COPY-SEQ an array containing other arrays as sub-arrays then you will get a freshly allocated new array containing references (pointers) to the sub-arrays of the original array. Common Lisp only allocates a new top-level sequence, containing references (pointers) to the elements of the original sequence.
There is a paper explaining when, how, and why Common Lisp uses values or references and how to compare them: