O maior exemplo de ponteiro para função está na função qsort
, da stdlib, que tem o seguinte cabeçalho:
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
A função qsort implementa o algoritmo quicksort e busca conseguir se adequar a qualquer estrutura de dados, ela pode receber int, float, structs e etc.
Para utilizar a qsort é necessário definir uma função que consigar comparar dois valores, o mesmo comportamento que a strcmp
da string.h apresenta, se o primeiro valor é maior que o segundo valor então a função retorna um valor maior que 0, se são iguais, então a função retorna 0, se é menor então retorna um valor menor que 0.
Return | p1, p2 |
---|---|
<0 | p1 < p2 |
0 | p1 == p2 |
>0 | p1 > p2 |
int comparador(const void * a, const void * b) {
int p1 = *((int*) a);
int p2 = *((int*) b);
if(p1 > p2)
return 1;
else if(p1 == p2)
return 0;
else
return -1;
}
int comparador(const void *a, const void *b) {
return *(int*)a - *(int*)b;
}
int main(void) {
int size = 10;
int * array = malloc(size * sizeof(int));
// Valores aleatórios
for(int i = 0; i < size; i++)
array[i] = rand() % size;
print(array, size);
// Usando a qsort
qsort(array, size, sizeof(int), comparador);
print(array, size);
}
3 6 7 5 3 5 6 2 9 1
1 2 3 3 5 5 6 6 7 9
Esse comportamento funciona para qualquer estrutura de dados, por exemplo, se definirmos o tipo data basta definir a função de comparativo para que assim o algoritmo consiga ordenar um vetor de datas.
typedef struct data Data;
struct data {
int dia;
int mes;
int ano;
};
Data createData(int dia, int mes, int ano) {
Data data;
data.dia = dia;
data.mes = mes;
data.ano = ano;
return data;
}
int compararData(const void * a, const void * b) {
Data p1 = *((Data*) a);
Data p2 = *((Data*) b);
// Comparar Ano
if(p1.ano > p2.ano) return 1; // Ano Maior
else if(p1.ano < p2.ano) return -1; // Ano Menor
// Ano Igual - Comparar Mês
else if(p1.mes > p2.mes) return 1;
else if(p1.mes < p2.mes) return -1;
// Mês Igual - Comparar Dia
else if(p1.dia > p2.dia) return 1;
else if(p1.dia < p2.dia) return -1;
// Tudo Igual
return 0;
}
int main(void) {
int size = 5;
Data * array = malloc(size * sizeof(Data));
array[0] = createData(10, 9, 2021);
array[1] = createData(27, 5, 2001);
array[2] = createData(25, 5, 2001);
array[3] = createData(31, 12, 1917);
array[4] = createData(11, 9, 2021);
print(array, size);
// Usando a srtcmp
qsort(array, size, sizeof(Data), compararData);
print(array, size);
}
Datas:
10/ 9/2021
27/ 5/2001
25/ 5/2001
31/12/1917
11/ 9/2021
Datas:
31/12/1917
25/ 5/2001
27/ 5/2001
10/ 9/2021
11/ 9/2021