Em C, qual é a diferença entre `& function` e` function` quando passados como argumentos?

Por exemplo

#include <stdio.h>

typedef void (* proto_1)();
typedef void proto_2();

void my_function(int j){
    printf("hello from function. I got %d.\n",j);
}

void call_arg_1(proto_1 arg){
    arg(5);
}
void call_arg_2(proto_2 arg){
    arg(5);
}
void main(){
    call_arg_1(&my_function);
    call_arg_1(my_function);
    call_arg_2(&my_function);
    call_arg_2(my_function);
}

Executando isso, recebo o seguinte:

> tcc -run try.c
hello from function. I got 5.
hello from function. I got 5.
hello from function. I got 5.
hello from function. I got 5.

Minhas duas perguntas são:

Qual é a diferença entre um protótipo de função definido com(* proto) e um definido sem?Qual é a diferença entre chamar uma função com o operador de referência &) e sem?

questionAnswers(4)

yourAnswerToTheQuestion