Hola Daniel.
Tus preguntas son totalmente pertinentes. Voy a intentar responderlas todas, aunque no en el orden que las hiciste.
Lo primero, creo que es importante dejar claro que es un arreglo. Un arreglo es una secuencia de elementos del mismo tipo almacenados consecutivamente en memoria. Es decir, su un elemento de un arreglo está en la posición X y tiene tamaño 4, el siguiente elemento del arreglo estará en la posición de memoria X+4. Además, el arreglo luego de definido tiene un tamaño máximo dado y el cual no se puede modificar. Dada esta característica del arreglo, de estar consecutivo en memoria, le permite a los lenguajes ofrecernos la posibilidad de acceder a cada elemento del arreglo de forma directa a través de un índice, por ejemplo arreglo[5] me devuelve el elemento en la posición 4 del arreglo.
Esto es totalmente diferente a una lista enlazada de nodos. En una lista, cada elemento puede estar en cualquier lugar de memoria, y para acceder a un elemento de la lista hay que "navegar" por la lista. Es decir, cada elemento (o nodo) tiene una referencia (un puntero) al siguiente elemento y esto es lo que nos permite acceder a todos los elementos. Sin embargo, no podemos acceder de forma directa a un elemento como si en un arreglo.
Con esto claro, volvamos a los arreglos.
En C, el arreglo lo podemos definir de dos formas (siendo muy generales): el tamaño se define en momento de compilación o el tamaño se define en momento de ejecución.
Al primer caso, se le suele llamar estático y al segundo dinámico, aunque esto es un poco confuso porque no es muy dinámico el segundo caso.
En el primer caso, el tamaño del arreglo es una constante dada por el programador y al momento de compilar, el compilador ya puede reservar el espacio de memoria necesario para ese arreglo.
En C esto se hace así: int vector[5]; Esto define un arreglo de enteros de tamaño 5.
El el segundo caso, el tamaño del arreglo puede ser una variable cuyo valor puede depender de la ejecución del programa y la reserva de memoria se hace mientras el programa está en ejecución.
En C esto se hace así: int * vector = new int[var]; Esto define un arreglo de enteros de tamaño 'var', donde var es una variable entera.
Este arreglo, luego de instanciado tampoco puede modificar su tamaño.
Luego, en el ejercicio se pide que utilices el segundo caso. Es verdad lo que dices que puede no tener mucho sentido hacer esto int * vector = new int [10], si ya se sabe el tamaño al momento de escribir el programa. Entiendo que es solo un ejemplo.
Saludos