Se tu hai questi indirizzi di memoria:

codice:
mat01  0x1000
mat02  0x1a00
mat03  0x1b00
Essendo mat01, mat02 e mat03 array e non puntatori (tra l' altro il nome non è significativo, chiamali semmai arr01, arr02 e arr03), il loro indirizzo è inassegnabile.
Cioè mat03 non può stare a sinistra di un assegnamento, ogni espressione di assegnamento che ha come lvalue mat03 è sbagliata.

Lo puoi fare con i puntatori tenendo conto che ogni parametro in C viene passato per valore, e tenendo conto che alla fine della funzione ogni variabile allocata nell stack (quindi un array ad esempio) viene deallocata.
Per cui devi usare l' allocazione dinamica:

codice:
void CatenaStr ( char A[], char B[], char** C ) 
{
// C è un puntatore a puntatore perché se fosse un puntatore a 
// char, l' assegnamento sarebbe fatto solo sulla variabile di copia
// che è locale alla funzione
      
    const unsigned long l1,l2;
    l1=strlen(A);
    l2=strlen(B);
    // Ho memorizzato la lunghezza delle stringhe per evitare di chiamare 
    // troppe volte la strlen (sarebbe inefficiente)
    *C=(char*)malloc( (strlen(A) + strlen(B) +1)*sizeof(char));
    strcpy(*C,A);
    strcpy( &  ((*C)[l1]), B);
 }

int main ()
{
      char arr1[20], arr2[20], *ptr;
      
      printf("Inserisci Testo01 : ");
      scanf("%s",arr1);
      printf("\nInserisci Testo02 : ");
      scanf("%s",arr2);
      
      // Richiamo la Funzione
      CatenaStr ( arr1, arr2, &ptr);
      return 0;
 }
Tutto questo se ho capito bene cosa vuoi fare, perché non è spiegato molto chiaramente.
Spero sia questa la tua richiesta.