в чем разница между вызовом функции как fun() и fun?


Я наткнулся на кусок кода, который выглядит следующим образом

qsort(array, 10, sizeof(int), sort);

Здесь сортировка снова является функцией. Но у меня всегда было впечатление, что любая вызываемая функция должна иметь () после имени функции или я что-то упустил.

Я просто хотел узнать, как это будет работать и каковы различия в вызове подобных функций. Спасибо!
4 3

4 ответа:

qsort(array, 10, sizeof(int), sort);

При этом передается указатель на функцию "sort", чтобы функция" qsort " могла вызвать эту функцию.

Эта функция не вызывается, она передается как указатель на функцию. См. указатели функций в языках C и C++

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

Правильный синтаксис должен включать в себя & перед sort (так как sort является функцией, а не указателем, поэтому нам нужно ссылаться на него), но компилятор "добавляет" его для вас в любом случае.

Если вы посмотрите на грамматику C (например, в стандарте C), вы обнаружите, что существует оператор, записанный как (), который является оператором вызова функции . Он аналогичен оператору подстрочного индекса массива [] в том, что он применяется к идентификатору, в данном случае к имени функции. Если за идентификатором функции не следует оператор вызова функции, то идентификатор представляет собой указатель на эту функцию. Итак, теперь становится ясно, какой qsort Последний arg is: указатель на функцию сравнения. Всякий раз, когда ему нужно сравнить два элемента, он вызывает функцию, на которую указывает его последний arg.

Функция sort в вашем примере называется функциейобратного вызова , qsort вызывает ее обратно (несколько раз, с разными аргументами).