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
?