c++中級編の参考書の下記のプログラムコメントになっている部分の挙動がわからないです。

reinterpret_cast<int(*)(const void *, const void*)>(int_cmp)

キャストしているのはかわかるのですがint(*)というのと(const void*,const void*)
が何をしているのかがわからないです、ポインタがどうたらっていうキャストをしているのはなんとなく察しがつくのですがしっかり理解したいので解説お願いします。

int int_cmp(const int* a,const int* b){
    if (*a < *b) {
        return -1;
    }
    else if(*a > *b) {
        return 1;
    }else {
        return 0;
    }
}

int main() {

    int i = 0;
    int nx = 0;
    int no = 0;
    cout << "配列の要素数:";
    cin >> nx;

    int *x = new int[nx];
    cout << nx << "個の要素数を昇順に入力せよ、\n";

    for (i = 0; i < nx; i++) {
        cout << "x[" << i << "]:";
        cin >> x[i];        
    }

    cout << "探索する値:";
    cin >> no;

    int *p = reinterpret_cast<int*>(
        bsearch(&no, x, nx, sizeof(int),
        /*ここです。*/
        reinterpret_cast<int(*)(const void *, const void*)>(int_cmp))
    );
        /* */

    if (p != NULL) {
        cout << "x[" << (p - x) << "]が一致します。\n";
    }
    else {
        cout << "見つかりません\n";
    }

    _getch();
    return 0;
}