В C, за исключением нескольких особых случаев, ссылка на массив всегда «распадается» на указатель на первый элемент массива. Следовательно, невозможно передать массив «по значению». Массив в вызове функции будет передан функции как указатель, который аналогичен передаче массива по ссылке.
EDIT: Есть три таких особых случая, когда массив не распадается на указатель к его первому элементу:
sizeof a
не совпадает с sizeof (&a[0])
. &a
не совпадает с &(&a[0])
(и не совсем как &a[0]
). char b[] = "foo"
не совпадает с char b[] = &("foo")
.