void foo()
означает, что функция foo может принимать любое количество аргументов неизвестного типа, тогда как
void foo(void *)
означает, что функция foo принимает аргумент типа void *
Вот почему программа компилируется, так как ваша функция может принимать аргументы любого типа, включая void *
Аргумент void *
- это пустой указатель, с которым не связан тип данных. Он может содержать адрес любого типа и может быть преобразован в любой тип.
Чтобы найти разницу между foo()
и foo(void *)
см. здесь