Array para decay ponteiro e passando arrays multidimensionais para funções

Eu sei que uma matriz decai para um ponteiro, tal que se declarado

char things[8];

e depois usadothings Em outro lugar,things é um ponteiro para o primeiro elemento na matriz.

Além disso, do meu entendimento, se alguém declara

char moreThings[8][8];

entãomoreThings énão do tipo ponteiro para char, mas do tipo "array de ponteiros para char", porque o decaimento só ocorre uma vez.

QuandomoreThings é passado para uma função (digamos com protótipovoid doThings(char thingsGoHere[8][8]) o que realmente está acontecendo com a pilha?

E semoreThings não é do tipo ponteiro, então isso ainda é realmente uma passagem por referência? Eu acho que sempre pensei quemoreThings ainda representava o endereço base do array multidimensional. E sedoThings levou a entradathingsGoHere e se passou para outra função?

É a regra praticamente que a menos que se especifique uma entrada de matriz comoconst então o array sempre será modificável?

Eu sei que o material de checagem de tipos acontece apenas em tempo de compilação, mas eu ainda estou confuso sobre o que tecnicamente conta como uma passagem por referência (isto é, somente quando argumentos do tipo ponteiro são passados, ou seria array de ponteiros por referência também?)

Desculpem estar um pouco por toda parte com essa pergunta, mas devido à minha dificuldade em entender isso, é difícil articular uma pergunta precisa.