Ma gli array non vengono passati di default per indirizzo?
Il problema è che la domanda è posta male perché basata su un'eccessiva semplificazione...
Nel C il passaggio degli argomenti avviene SEMPRE per valore (ossia per copia). Quindi se vogliamo che una funzione lavori direttamente su una variabile dichiarata al di fuori della funzione stessa, l'unico modo è accedere ad essa attraverso il suo indirizzo di memoria (da cui il nome passaggio per indirizzo), che passeremo alla funzione attraverso un parametro formale di tipo puntatore opportuno.
Gli array statici non sono puntatori, ma costituiscono dei tipi a parte. Considerando per esempio i seguenti array
int u[2];
int v[3];
va detto che u e v sono di tipo diverso, ossia rispettivamente di tipo int[2] e int[3].
Anche se gli array statici non sono puntatori, esiste cmq uno stretto legame tra di loro: ossia l'identificatore di un array, tranne poche eccezioni (tra cui va annoverato l'operatore sizeof), viene sempre convertito in un puntatore al suo primo elemento. Questo è il motivo per cui una funzione
fun(int *ptr)
accetta come parametri attuali sia u che v.
Quindi, tornando alla tua domanda, si deduce che il passaggio può essere considerato per indirizzo se lo scopo è quello di lavorare sugli elementi dell'array, ma se invece vogliamo modificare il puntatore passato come parametro formale, allora il passaggio non è per indirizzo, e l'output che ricevi ne è la prova!