2014-01-11 3 views
0

Вот следующая функция, которая, как предполагается сравнить значения двух целых чисел a и b и если возвращает положительное число a>b и отрицательное число иначе:Функция сравнения целых чисел в C (указатели)

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

+0

хорошо ... это не о указателях, это просто математика. Если 'a b', то' a - b' будет положительным, а если 'a == b', то' a - b == 0'. –

+1

Ваша функция действительно должна называться 'void_cmp': P –

+0

@ Moo-Juice Почему? Это должно быть сравнение целых чисел, нет? –

ответ

1

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

0

Я предполагаю, что этот метод используется в более общем обратном вызове, которая ожидает указатель на функцию следующего вида

int (*)(const void*, const void*) 

Это единственная причина, я могу видеть, чтобы использовать const void* здесь вместо const int*.

Причина для const заключается в том, что сравнение должно быть операцией, которая считывает данные только. Для их сравнения не должно быть необходимости изменять параметры. Поэтому стандартное определение сравнения принимает const данных для поощрения исполнителей, чтобы иметь правильное поведение

Смежные вопросы