Как правильно передавать функцию в качестве параметра?
Оба варианта правильные. Имя функции это и есть указатель на функцию, так что sizeof(foo) == sizeof(&foo). По сути тут компилятор просто игнорирует операцию взятия адреса от функции.
Вся функция никогда не передается - только указатель.

Я бы предпочел второй вариант, т.к. тут явно указано, что надо передавать указатель на функцию.
На самом деле тип указателя на функцию я бы оформил через typedef, и в параметре указывал бы уже имя типа:
typedef void (*foo_t)();
void fooPrint(foo_t foo) {
    foo();
}
Если компиллятор глотает оба варианта и тесты проходят - то я-бы взял просто первый вариант. 

Там меньше букв.