Основным мотиватором для передачи массивов по ссылке является предотвращение переполнения стека и ненужного копирования больших объектов. Например, представьте, если бы у меня была такая функция:
void foo(int x[500000000000]);
Стек, вероятно, переполнится при первом вызове функции, если все массивы будут переданы по значению (но, конечно, это явное преувеличение).
Это станет полезным при использовании объектно-ориентированных методов. Предположим, вместо массива у вас было это:
void foo(SomeClass x);
где SomeClass - класс с 500000000000 членами данных. Если бы вы вызвали такой метод, компилятор скопировал бы бит по битам, что, по меньшей мере, было бы очень долгим процессом. По-прежнему применима та же концепция, что и в массивах, но вы должны указать, что она будет использоваться по ссылке вручную:
void foo(SomeClass &x);
(и не пытайтесь сначала создать массив элементов 500000000000, если у вас нет 64-битной машины и много оперативной памяти)