A função de comparação de números inteiros em C (ponteiros)
-
26-12-2019 - |
Pergunta
Veja a seguinte função, que é suposto para comparar os valores de dois números inteiros a
e b
e retorno de um número positivo se a>b
e um número negativo caso contrário:
int int_cmp(const void *a, const void *b)
{
const int *ia = (const int*)a;
const int *ib = (const int*)b;
return *ia - *ib;
}
Eu não sou muito familiarizado com a constant
ponteiros (ou ponteiros para constant
s) e eu realmente não entendo o raciocínio por trás da função acima.Eu agradeceria se alguém pudesse fornecer um passo a passo de uma explicação.
Solução
suponha que, em o autor da chamada de função, você tem duas variáveis int,
int p = 10;
int q = 5;
agora , a partir de sua main()
você está chamando int_cmp(&p, &q);
para comparar seus valores.
na função de recepção int_cmp()
os parâmetros são feitas const
de modo que, dentro do int_cmp()
função, os valores de int p
e int q
não deve ser alterado.Se os valores de a
e/ou b
é alterado no int_cmp()
, eles vão ser alterado no main()
também, como eles têm sido transmitidos com o uso de referência.assim, para manter os valores inalterados, a const
é usada.
Ao lado, uma vez que os parâmetros são recebidos em int_cmp()
, eles são typecasted para int
como os operadores aritméticos podem ser seguramente permitido em ponteiros de definição de tipo de variável.
Espero que o atithmatic parte é bastante simples.É de referenciar os ponteiros e o cálculo da diferença entre os valores dos ponteiros a
e b
e retornando o valor da diferença.
Outras dicas
Eu estou supondo que este método é utilizado em mais geral chamada de retorno que espera um ponteiro de função do seguinte tipo
int (*)(const void*, const void*)
Esta é a única razão que eu posso ver a utilizar const void*
aqui em vez de const int*
.
A razão para const é que a comparação deve ser uma operação que lê os dados apenas.Ele não tem nenhuma necessidade de transformar os parâmetros para compará-los.Daí a definição padrão de comparar leva const
dados para incentivar os implementadores têm o comportamento correto