C语言指向函数的指针有关问题的求教

C语言指向函数的指针问题的求教
最近深入研究了指向函数的指针的问题,还有一个问题难以释怀。
#include<stdio.h>
int main()
{
int (*p)(int,int);
int max(int ,int);
int a = 3;
int b = 4;
p = max; //p = &max也可以(这个已经理解)
p(3,4);
(*p)(3,4);
}

int max(int c,int d)
{
......
}
我的理解是(*p)()去调用max函数的时候:p是函数指针,*p是解指针,表示函数类型,然后会再隐式转换成函数指针进行调用。
但是关于p()的调用,看到两种声音:
其一:因为p已经是函数指针,不需要进行任何类型的转换直接调用。
其二:编译器会自动在p前面加上*进行隐式解指针,就会变成函数类型,在隐式转换到函数指针调用。
这两种哪个是对的呢?还是说根据不同的编译器二不同?
------解决方案--------------------
你好:
我想跟你确认下,如果直接用函数名去调用函数,编译器是不是会自动隐式转换成函数指针调用?
------------------------------------------------------------------------------------------------------------------------------
不会。


另外,就如我上面说的p()这种直接用函数指针调用,编译器是不是会自动加上*转换成函数类型,再隐式转换到函数指针(因为我觉得既然已经是直接用函数指针调用了,编译器需要的就是一个函数指针,为什么还要做这么一步间接操作呢)
------------------------------------------------------------------------------------------------
也不会,p是直接使用的。但若是( ************p)( ... )则存在隐式转换。