¿Cómo ordenar una serie de punteros para char en C?

Supongamos que tengo una serie de punteros para char en C:

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

Y deseo ordenar esta matriz usando qsort:

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

No puedo encontrar la función de comparación. Por alguna razón, esto no 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_);
}

Hice mucha búsqueda y descubrí que tenía que usar** dentro de 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_);
}

Y esto funciona.

¿Alguien puede explicar el uso de*(const char **)name1 en esta funcion? No lo entiendo en absoluto. ¿Por qué el doble puntero? ¿Por qué no funcionó mi función original?

Gracias, Boda Cydo.

Respuestas a la pregunta(8)

Su respuesta a la pregunta