Функция сравнения целых чисел в C (указатели)
-
26-12-2019 - |
Вопрос
Вот следующая функция, которая должна сравнивать значения двух целых чисел a
и b
и вернуть положительное число, если a>b
и отрицательное число в противном случае:
int int_cmp(const void *a, const void *b)
{
const int *ia = (const int*)a;
const int *ib = (const int*)b;
return *ia - *ib;
}
Я не слишком знаком с constant
указатели (или указатели на constant
s), и я не совсем понимаю причину этой функции.Буду признателен, если кто-нибудь сможет дать пошаговое объяснение.
Решение
предположим, что в вызывающей функции у вас есть две переменные типа int:
int p = 10;
int q = 5;
теперь из твоего main()
Вы звоните int_cmp(&p, &q);
сравнить их значения.
в функции приема int_cmp()
параметры сделаны const
так что внутри int_cmp()
функция, значения int p
и int q
не следует изменять.Если значения a
и/или b
изменяется в int_cmp()
, они будут изменены в main()
также, поскольку они были переданы по ссылке.поэтому, чтобы сохранить значения неизменными, const
используется.
Далее, как только параметры получены в int_cmp()
, они приводятся к типу int
поскольку арифметические операторы можно безопасно разрешить для указателей определенного типа переменной.
Надеюсь, арифматическая часть достаточно проста.Это разыменование указателей и вычисление разницы между значениями указателей. a
и b
и возвращаем значение разницы.
Другие советы
Я предполагаю, что этот метод используется в более общем обратном вызове, который ожидает указатель на функцию следующего типа
int (*)(const void*, const void*)
Это единственная причина, по которой я вижу использование const void*
здесь вместо const int*
.
Причина использования const заключается в том, что сравнение должно быть операцией, которая только считывает данные.Не должно быть необходимости изменять параметры для их сравнения.Следовательно, стандартное определение сравнения принимает const
данные, чтобы побудить разработчиков к правильному поведению