Pregunta

Aquí está la siguiente función que se supone que compara los valores de dos números enteros. a y b y devolver un número positivo si a>b y un número negativo en caso contrario:

 int int_cmp(const void *a, const void *b)
{
    const int *ia = (const int*)a;
    const int *ib = (const int*)b;
    return *ia - *ib;
}

No estoy muy familiarizado con constant punteros (o punteros a constants) y realmente no entiendo el razonamiento detrás de la función anterior.Agradecería que alguien pudiera explicarme paso a paso.

¿Fue útil?

Solución

supongamos que, en la función de llamada, tienes dos variables int,

int p = 10;
int q = 5;

ahora, desde tu main() estas llamando int_cmp(&p, &q); para comparar sus valores.

en la función de recepción int_cmp() los parametros estan hechos const para que dentro del int_cmp() función, los valores de int p y int q no debe cambiarse.Si los valores de a y/o b se cambia en el int_cmp(), serán cambiados en el main() además, como han sido pasados ​​usando referencia.entonces, para mantener los valores sin cambios, el const se utiliza.

A continuación, una vez recibidos los parámetros en int_cmp(), están encasillados en int ya que los operadores aritméticos se pueden permitir de forma segura en punteros de tipo de variable definido.

Espero que la parte aritmática sea bastante sencilla.Se trata de eliminar la referencia de los punteros y calcular la diferencia entre los valores de los punteros. a y b y devolver el valor de la diferencia.

Otros consejos

Supongo que este método se usa en una devolución de llamada más general que espera un puntero de función del siguiente tipo

int (*)(const void*, const void*)

Esta es la única razón que veo para usar const void* aquí en lugar de const int*.

El motivo de const es que la comparación debe ser una operación que lea solo datos.No debería ser necesario modificar los parámetros para compararlos.Por lo tanto, la definición estándar de comparar toma const datos para alentar a los implementadores a tener el comportamiento correcto

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top