Puntero fundido para usar con qsort

Este fragmento de código se copió a mano de un libro que estoy leyendo:

<code>/* scmp: string compare of *p1 and *p2 */
int scmp(const void *p1, const void *p2)
{
        char *v1, *v2;
        v1 = *(char **) p1; 
        v2 = *(char **) p2; 

        return strcmp(v1, v2);
}
</code>

Esta función se usa con qsort para ordenar una matriz de cadenas. El punto que no entiendo es por qué.v1 = *(char **) p1; en lugar de solov1 = (char *) p1; o ni siquiera este trabajo;v1 = p1;? Supongo que el compilador debería encasillar automáticamente esa tarea. O incluso, considere esto:

<code>/* scmp: string compare of *p1 and *p2 */
int scmp(const void *p1, const void *p2)
{
        return strcmp(p1, p2);
}
</code>

Creo que (podría estar muy mal) el compilador se supone que debe encasillarp1 yp2 dentrochar * ya que es lo questrcmp(char *, char *) espera

En resumen, la pregunta es por qué.v1 = *(char **) p1 ?

Respuestas a la pregunta(1)

Su respuesta a la pregunta