Я пытаюсь узнать о указателях void и функциях, имеющих typedef (в C). Я не могу понять концепцию.Понимание указателей void и функций указателя typedef
У меня есть этот простой код:
#include <stdio.h>
typedef int (*CompareFunc)(void*, void*);
int compareints(void *a, void *b)
{
return a-b;
}
int comparedbls(void *a, void *b)
{
return a-b;
}
int main()
{
int a = 1, b = 1;
int* ptrA = &a;
int* ptrB = &b;
CompareFunc test = compareints;
printf("%d\n", test(ptrA, ptrB));
return 0;
}
Выход здесь "-4". Я не понимаю, почему. Я знаю, что это какая-то кастинг, которую я не делаю, потому что чувствую, что я вычитаю адреса. Я бы напечатал значения void *a
и void *b
с printf("%d", a)
, чтобы узнать, какие значения у них есть, но он говорит, что это невозможно, потому что a
является указателем на пустоту.
И с функцией CompareFunc
, должен ли я сделать новую переменную, чтобы указать на каждую функцию, которую я хочу? Я не совсем уверен, в каком случае использование typedef в функции указателя когда-либо будет полезно. Почему бы просто не позвонить compareints()
напрямую? Спросить, потому что у меня есть задание, и не могу понять, зачем нам его кодировать так.
Любая помощь будет оценена по достоинству. Спасибо!
Используйте '% p' печатать' 'недействительные * с. Ваш вывод '-4' неудивительный, и вы поймете, почему, как только вы печатаете адреса. Вы используете указатели функций, чтобы вы могли хранить или передавать указатели на функции или обменяться функциями с одной и той же сигнатурой (например, см. Stdlib ['qsort()'] (http: // man7.org/linux/man-pages/man3/qsort.3.html) для примера, где они полезны) –
Спасибо! Это подтвердило, что я вычитал адреса. Никогда не знал о '% p', очень удобно. –
Вы можете найти [Как отсортировать массив структур в C] (https://stackoverflow.com/questions/8721189) и ['qsort()' function - пытаться использовать компаратор) (https: // stackoverflow. com/вопросы/10405786 /) полезно. –