Como classificar uma matriz de ponteiros para char em C?

Suponha que eu tenha uma matriz de ponteiros para char em C:

char *data[5] = { "boda", "cydo", "washington", "dc", "obama" };

E eu gostaria de classificar essa matriz usando qsort:

qsort(data, 5, sizeof(char *), compare_function);

Não consigo criar a função de comparação. Por alguma razão, isso não funciona:

int compare_function(const void *name1, const void *name2)
{
    const char *name1_ = (const char *)name1;
    const char *name2_ = (const char *)name2;
    return strcmp(name1_, name2_);
}

Pesquisei bastante e descobri que precisava usar** dentro do qsort:

int compare_function(const void *name1, const void *name2)
{
    const char *name1_ = *(const char **)name1;
    const char *name2_ = *(const char **)name2;
    return strcmp(name1_, name2_);
}

E isso funciona.

Alguém pode explicar o uso de*(const char **)name1 nessa função? Eu não entendo nada disso. Por que o ponteiro duplo? Por que minha função original não funcionou?

Obrigado, Boda Cydo.

questionAnswers(8)

yourAnswerToTheQuestion