Ponteiro para uso com o qsort

Esta mão de trecho de código copiada de um livro que estou lendo:

<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>

Essa função é usada com o qsort para classificar uma matriz de seqüências de caracteres. O ponto que eu não entendo é, porquev1 = *(char **) p1; em vez de apenasv1 = (char *) p1; ou nem mesmo esse trabalho;v1 = p1;? Eu acho que o compilador deve automaticamente typecast esse assigment. Ou até mesmo, considere isto:

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

Eu acho que (eu posso estar muito errado) o compilador é suposto a typecastp1 ep2 para dentrochar * desde que é o questrcmp(char *, char *) espera.

Resumindo, a questão é por quev1 = *(char **) p1 ?

questionAnswers(1)

yourAnswerToTheQuestion