L'instruction
key = keypad.waitForKey();
renvoie un char puisque c'est ce qui a été déclaré dans le tableau. Tu pourrais afficher des char sur ton écran, mais celui qui a codé a décidé d'afficher des nombres (int) : il passe donc par une variable intermédiaire (hours) dans laquelle il stocke l'heure et qu'il affichera ensuite.
L'indice d'un tableau commence à 0, donc un tableau de dimension 3 contient un élément numéroté 0, puis un 1 puis un 2. Il met le caractère \0 dans le dernier élément pour indiquer que la chaîne de caractère est terminée et traduit en int via la commande atoi.
Cette manière de faire n'est pas forcément la plus optimale, mais c'est son choix...