De entrada, C tiene una curvatura de aprendizaje muy muy larga, así que o se tiene paciencia, o es mejor saltar a otro lenguaje... Además si uno accede a C, sin conocimientos previos de ningún tipo, es manifiestamente más complicado, porque se rodea de demasiada jerga que complica al no iniciado.
Si dentro de un bucle pones una llamada que interrogue al usuario para pulsar una tecla, evidentemente el suceso es que se detiene la ejecución en ese punto hasta recibir una pulsación de tecla....
Así que, en efecto, esa funconalidad no te sirve si lo que pretendes es que se ejecute sin pausa y salga cuando se pulse determinada tecla.
El driver del teclado, almacena en un búfer las teclas que se van pulsando y el sistema operativo, obtiene información sobre el búfer mediante interrupciones, cuando se detecta que hay nuevas pulsaciones, las aplicaciones que se 'enganchen', reciben una notificación, donde se señala el código de la tecla pulsada y algún detalle extra.
Por ejemplo, si una aplicación tiene interfaz de usuario, cada control de la interfaz gráfica que tenga eventos de teclado, se engancha a dichas funciones y son notificadas... la forma en que el usuario interacciona en dicho caso es muy similar al getch.
Básicamente una función recibe la notificación y dentro se examina si se dan las condiciones que se desean... y se activa algún flag que se consulta en otra parte (o s e lanza un evento en caso de objetos, para notificar a otros objetos que estén enganchados a dichas notificaciones)
funcion NotificacionTeclado( entero codigo, entero flags) //flags puede ser indicadores del tipo del estado de las teclas ALT, Mayusculas, CTRL, etc...
Si codigo = codigoquemeinteresa luego
codigoEntrado = TRUE
fin si
fin funcion
Y tu bucle lo condicionas a la espera de dicho suceso (o añadido a otras condiones si hay más)
... otra función en alguna parte
codigoquemeinteresa = ???? //el que tu veas preciso...
bucle ....
...loque sea que haga el bucle
repetir mientras codigoEntrado = FALSE // and ....otras condiciones
codigoEntrado = FALSE // se desactiva la bandera salvo que se requiera algo más adelante...
Lo que te señala Mafus, de getch es para hacer la parte que en el pseudocódigo se señala como función...
Nota que codigoEntrado se declara de tipo buleano a nivel del módulo lo mismo que 'codigoquemeinteresa', que ha de contener el valor del código que tu esperas (el valor asociado a la tecla 'd' (con ayuda de un flag, sabrás si es 'd' ó 'D'...)
De todos modos si estás empezando, aprendiendo, debes hacerlo con código que entiendas de cabo a rabo, e ir avanzando poco a poco...
Más adelante, cuando ya tengas una base mínima del lenguaje (el tiempo transcurrido para esto es relativo, ya que cada cual aprende a su ritmo y cada cual dedica el tiempo que quiere-puede) ya entonces con ejemplos más complejos, aunque parte del código no lo entiendas.
A menudo al poner un ejemplo para explicar algo, o se pone un ejemplo demasiado tonto, o fuerza a ponerse algo más ameno a cambio de exponer cosas que aún no se hayan dado... en los ejemplos, quédate con la parte que comenta el libro, tutorial, curso que estés leyendo/siguiendo/dando, ya llegará la parte en que explique aquello que en dicho instante queda oscuro...