En el .h lo que haces es declarar las funciones que vas a implementar en el .c y utilizar en algún otro source. Es decir, declarar los prototipos, constantes, etc.
Este archivo .h junto con su respectivo .c, funcionará como una entidad aparte o una parte de tu programa entero.
Las ventajas que tiene es que puedes utilizarlo en todos los programas que quieras, porque al ser una entidad aparte, éste funciona de tal manera (dependiendo de las precondiciones y postcondiciones) que no cambiará, independientemente del programa en el que lo utilices. Estará disponible siempre y cuando incluyas el header en el .c donde utilizarás las funciones que éste posea. Además de que simplifica mucho el debugging porque si ya trabajaste con esta función creada, sabes que no contiene ningún error siempre y cuando estés cumpliendo las precondiciones!
Ejemplo:
Vos querés hacer un programa que haga un número elevado a otro (potencia).
Pero claro, por qué no mejor dividirlo, creo una función que potencie dos números en un archivo aparte, y luego podré utilizarla no sólo en éste, sino en todos los programas que se me antojen. Pues bien, creo un .h y declaro mi funcion "potencia". Ahora creo un .c, e implemento mi función potencia (incluyendo, obviamente al header para que reconozca el prototipo de la función).
Pues bien, ya tengo mi .h con una función potencia y su respectivo .c donde está implementada. Ahora puedo crear todos los programas que quiero, incluyendo el .h donde está mi función potencia y utilizarla! Así como incluyes el stdio para utilizar scanf y printf o el stdlib para alocar y liberar memoria, etc.
Te recomiendo leer sobre TDAs. Justamente, este conjunto de archivos header y source se conoce, comúnmente, como Tipo de Dato Abstracto.PD: Quizás te oscurecí más de lo que te aclaré, pero leyendo algo sobre TDA te irás dando cuenta, cualquier cosa vuelve a preguntar y trataré de aclararlo mejor