RE:parametro: arreglo por valor
No, no, cuando se pasa un array a una función siempre es por referencia (o por "variable") precisamente por eso, porque en realidad lo que se pasa es el puntero. Que yo sepa, no se puede pasar por valor. Una posible alternativa sería declarar un tipo estructura que contuviera al array, y pasar como parámetro la estructura por valor, de modo que se haría copia de la estructura entera y el array no se compartiría. De todas formas es un poco chapuza, la verdad
Lo mejor es especificar como "const" el parámetro, para demostrar a los usuarios de la función que no vas a tocar el array aunque se pase por referencia.
Si lo que quieres es modificar el array que se te pasa pero que tus cambios no se vean fuera, lo mejor es que te hagas una copia local y modifiques esa.
Suerte!