Allora ti conviene prima darti una studiatina ai puntatori (studiarli per bene, perchè non è un argomenti dei più semplici).
Comunque, per ottenere la dinamicità negli array si deve ricorrere ai puntatori, ovvero a delle particolari variabili che contengono indirizzi di memoria. L'indirizzo di memoria di un puntatore, lo dice il nome stesso, corrisponde ad una cella di memoria che contiene (o è atta a contenere) un valore. Questa cella di memoria viene detta "puntata" dalla variabile puntatore. Un array altro non è che un puntatore immutabile ad una porzione di memoria: una memoria limitata alla quantità descritta quando lo dichiari.

Senza dilungarmi troppo sull'argomento (che richiederebbe troppo tempo), per ottenere un array dinamico devi conoscere queste cose:

1) l'utilizzo della funzione malloc() (o una delle sue derivate (calloc(), ecc...);

2) la quantità di spazio richiesta per il tipo di dato che intendi inserire nell'array;

3) l'aritmetica dei puntatori.

Vediamo come si fa ad allocare, dinamicamente, un array di interi quando il numero dei suoi elementi viene preso in input da tastiera:
codice:
int main() {
   int *mioArray;  // Sarà il mio array
   int quantiElementi;  // Lo chiedo all'utente
   int i;   // Indice per scorrere l'array

   printf("Quanti elementi deve avere l'array? ");
   scanf("%d", &quantiElementi);

   // Alloco il mio array:
   mioArray = (int *) malloc(quantiElementi * sizeof(int));

   // Lo riempio:
   for(i=0; i<quantiElementi; i++) mioArray[i] = i;

   // Lo stampo a video:
   printf("\n\n");
   for(i=0; i<quantiElementi; i++) printf("%d ", mioArray[i]);
   printf("\n\n");

   return 0;
}
Come vedi la dimensione dell'array la chiedo all'utente e in base al valore che lui mi passa, io creo l'array.


Ciao.