Aunque puedes poner lo que quieras (se puede hacer #includes de los cpps), lo usual es que las definiciones de estructuras, constantes, enumeraciones y el prototipo de funciones las pongas en el archivo h, mientras que la implementación de las funciones van en los c.
El compilador usualmente compila los cpps. Pero el cpp necesita la función definida antes de poder emplearla. Para eso son útiles los h. Agrupas definiciones y simplemente cuando la vayas a emplear en los .c, haces un #include "archivo.h" para incluir las definiciones de "archivo.h" en tu .c.
El mecanismo detrás de esto es que el precompilador "abre" el .h, copia lo que tiene dentro, lo cierra, abre el .c y reemplaza la sentencia #include "archivo.h" por todo lo que había en el .h. De esta forma ya no tienes que andar copiando definiciones de un archivo a otro: el precompilador lo hace por tí.
Saludos.