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 constants) 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.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top