mmmm ya, pondre varios ejemplos similares a los ejercicios que pusiste al principio de modo que puedas resolverlos más facilmente.
1. tipos enumerados
// Declaración del tipo enumerado 'Color' con los valores posibles 'Amarillo', 'Azul', 'Rojo', 'Blanco' y 'Verde'.
typedef enum{Amarillo, Azul, Rojo, Blanco, Verde} Color;
// Declaración del tipo enumerado 'Día'
typedef enum{Domingo, Lunes, Martes, Miercoles, Jueves, Viernes, Sabado} Dia;
2. punteros a funciones
Para comenzar, de nuevo la regla:
"Comenzar leyendo la declaración desde el nombre que esta en el parentesis mas interno, despues lee a la derecha y despues a la izquierda. Luego cuando termines de leer el parentesis, saltar hacia afuera y comenzar leyendo de derecha a izquierda nuevamente. Continuar hasta que toda la declaración haya sido leida".
faltaria agregar que durante la lectura cada vez que se encuentre un:
* significa que se tiene un puntero.
( significa que se tiene una funcion.
[ significa que se tiene un arreglo.
Ejemplo: Declaración de un puntero 'pf' a una función que no toma argumentos y devuelve un int
int (*pf)(); Apliquemos la regla anterior para comprobar si es lo que se pidio:
Primero empezamos por el elemento que este dentro de los parentesis más internos. En este caso ese elemento es 'pf'. Vemos qué hay a su derecha, encontramos el parentesis de cierre osea que no hay nada a su derecha. Seguidamente vemos qué hay a la izquierda, encontramos un '*' osea que
pf es un puntero. Luego, saliendo de dentro de los parentesis (*pf), a la derecha encontramos un '(' entonces tenemos que
pf es un puntero a una función. Como inmediatamente encontramos un ')', la función a la que apunta 'pf' no toma argumentos. Hasta aqui tenemos que
pf es un puntero a una función que no toma argumentos. Luego nos toca ver a la izquierda, encontramos un 'int' con lo que concluimos que
pf es un puntero a una función que no toma argumentos y devuelve un int.
Ejemplo: Un puntero 'func1' a una función que toma dos argumentos uno int y otro float y no devuelve nada
void (*func1)(int, float);Empezamos con el identificador 'func1'. Nada a la derecha; a la izquierda un '*' lo cual nos indica que
'func1' es un puntero. Seguimos, a la derecha esta un '(', entonces tenemos que
'func1' es un puntero a una función. Continuamos hasta encontrar el correspondiente ')' y tenemos que
'func1' es un puntero a una funcion que toma como argumentos un int y un float. Finalmente vemos que a la izquierda se encuentra un 'void' con lo que nuestra lectura quedaria como:
'func1' es un puntero a una función que toma como argumentos un int y un float y no devuelve valoresEn fin, si aun no se entendio, puedes buscar el google poniendo "Declaraciones complejas en C" o algo similar. Aunque si estas comenzando con el lenguaje C (o C++) es mejor que le prestes atención a otros temas más importantes ya que este tipo de declaraciones complejas no se ven mucho cuando uno programa de manera rutinaria.
Saludos