Bueno.... en C el uso de arrays es igual que en C++ como ya te han indicado, en cuanto a hacer un array de tamaño vble no hay ningún secreto... existe una función en C que se llama malloc (stdlib.h) que te permite hacer una asignación dinámica de memoria, esto es, te permite definir el espacio en memoria que vas necesitar dependiendo de los requerimientos de tu programa una vez que éste esté en ejecución.... Una vez que hayas terminado con esa memoria se vacía con la función free.
Estas dos finciones tienen sus hermanos en C++, new y delete.
Bien, como veo que andas un poco perdido te voy a entregar el ejemplo que propones realizado para que entiendas su uso:
#include<stdio.h>
#include<stdlib.h>
void main()
{
int *a,i,n_elem;
printf("Introduce numero de elementos del array: ");
scanf("%d",&n_elem);
a=malloc(n_elem*sizeof(int)); //asignamos memoria para n_elem de tipo int
for(i=0;i<n_elem;i++)
{
printf("nIntroduce dato %d: ",i+1);
scanf("%d",a+i);
}
for(i=n_elem;i>0;i--)
printf("n%d",a[i-1]);
}
Como verás he utilizado punteros, que son como los arrays (los arrays no son más que punteros que se manejan de otra manera), en fin como verás el código funciona, es corto y te proporciona un gran abanico de posibilidades, pues a partir de ahora no necesitas saber el tamaño de un dato o un array antes de realizar el programa. Según vayas ahondando el el mundo de la programación verás que la asignación dinámica de memoria se hace indispensable en ciertos campos (manejo de ficheros, listas, pilas y colas...)
Un saludo.