Вопрос

Вот следующая функция, которая должна сравнивать значения двух целых чисел 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 указатели (или указатели на constants), и я не совсем понимаю причину этой функции.Буду признателен, если кто-нибудь сможет дать пошаговое объяснение.

Это было полезно?

Решение

предположим, что в вызывающей функции у вас есть две переменные типа 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 данные, чтобы побудить разработчиков к правильному поведению

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top