Нет, нет никакой разницы, поскольку функция может быть неявно преобразована в указатель на функцию.
Соответствующая цитата из стандарта (N3376 4.3/1).
Значение l типа функции T может быть преобразовано в prvalue типа "указатель на T". Результатом является указатель на
функция.
Ответ 2
Есть ли разница между этими двумя вызовами:
Нет, нет разницы.
Ответ 3
bar(foo); называется "короткой" версией
bar(&foo); заключается в том, как это официально делается
Функционально, нет никакой разницы, однако большинство других вариантов считают "хорошей практикой" большинством, так как это более очевидно, что foo фактически является указателем на функцию, а не фактической функцией.
Это похоже на массивы. Если у вас есть:
int foobar[10];
то foobar - это int *, но вы также можете сделать foobar для того же результата.