qsort() - сравнить параметр функции

Допустим, у меня есть структура с именем Student.

typedef struct student {
    int age;
    char name[10];
} Student;

И у меня есть массив указателей на студентов.

Student *a[10];

Мне нужно отсортировать массив по именам студентов. Поэтому я написал функцию сравнения:

int compare(const void *a, const void *b){
    Student *temp1=*(Student **)a;
    Student *temp2=*(Student **)b;
    return strcmp(temp1->name, temp2->name);
}

Затем у меня есть функция для сортировки:

void SortArray(Student *a[], int len){
    qsort(a, len, sizeof(Student *), *compare*);
    printArray(a);
}

Последняя часть qsort - это то, чего я не понимаю. Я видел несколько постов, где писали &compare, а некоторые нет. Только когда я использовал &compare, это сработало.
Как узнать, использовать ли & или нет?


person ethanpasta    schedule 14.10.2017    source источник
comment
Функции похожи на массивы в одном отношении: если функция используется вместе с указателем на функцию, она распадается до указателя. Обычно безопасно использовать, например. только compare, но я рекомендую вам использовать &compare, чтобы сделать его более понятным для читателей кода.   -  person Some programmer dude    schedule 14.10.2017
comment
Вам не нужно никаких украшений, просто передайте compare.   -  person Amit    schedule 14.10.2017
comment
&compare является явным/читабельным точно так же, как &array[0]: сбивает с толку и необоснованно уродливым для любого, кто знает язык. Просто используйте compare или array. Обратите внимание, что каждый раз, когда вы вызываете функцию, как в случае func(x), имя func уменьшается до указателя, поскольку оператор () (вызов функции) требует в качестве операнда указатель на функцию.   -  person R.. GitHub STOP HELPING ICE    schedule 14.10.2017


Ответы (2)


В качестве имени функции, на которую ссылается функция, можно использовать имя функции. Кроме того, как упоминалось в комментариях, & тоже можно ссылаться.

person OmG    schedule 14.10.2017

Вы пытались вызвать функцию, например:)

qsort(a, len, sizeof(Student *), ***********compare);

или нравится

qsort(a, len, sizeof(Student *), &***********compare);

В соответствии со стандартом C (6.3.2.1 L-значения, массивы и указатели функций)

4 Указатель функции — это выражение, имеющее функциональный тип. За исключением случаев, когда это операнд оператора sizeof65) или унарного оператора &, указатель функции с типом ''тип, возвращающий функцию'' преобразуется в выражение, имеющее тип ''указатель на возвращаемый тип функции''< /сильный>.

Итак, в этом выражении

***********compare

указатель функции compare неявно преобразуется в указатель на функцию, затем с применением разыменования он, в свою очередь, преобразуется в тип функции, а затем снова в указатель на функцию и так далее.

Конечно, вы можете явно указать &compare, хотя это и не обязательно.

Вот демонстрационная программа

#include <stdio.h>

void f(void)
{
    puts("Hello eitanmayer");
}

void g(void f(void))
{
    f();
}

int main( void )
{
    g(&******f);
}

Его вывод

Hello eitanmayer

Так что проблема с вашим кодом может быть где-то еще.

person Vlad from Moscow    schedule 14.10.2017