El ejempo que te dió el amigo radon es muy genérico y con un array "inicializado".
Cabe aclarar que si tu array es muy grande y lo pretendes inicializar, esto llega muchas lineas de código. Piensa en assembler, inicializar un array, significa que tienes varios movlw dato para cargar el WREG y que luego son ubicados en la posición de memoria del subíndice del array adecuado.
Si tu quieres recibir caracteres por la usart, lo más adecuado sería un array de unsigned char (datos de 8 bits sin signo)
Lo declaras asi:
Codigo:
unsigned char datos[80];
unsigned char n;
Y luego lo direccionas algo así.
Codigo:
datos[n] = getc();
y luego incrementas n o lo decrementas, de acuerdo a como quieras almacenar tu arreglo de datos.
Si utilizaras un array de 2 dimensiones, usas el ejemplo de radon.
Escrito originalmente por radon
Lo que hay que tener en cuenta es que para declararla se cuenta desde el 1, y para apuntar desde el 0 
Esto es porque cuando uno declara una variable, uno reserva N posiciones de memoria.
Entonces al hacer :
unsigned char datos[8] ;
Reservamos 8 bytes en la memoria RAM.
Ahora bien, para "direccionar" esto, se comienza del 0, porque es la posicion 0 respecto al inicio del arreglo, hasta la posición 7 desde el inicio del arreglo (que es el 8vo byte). Esa es la explicación de poruqe se comienza de 0.
Saludos