int *func(…..)与int (*func)(…)为何有差异?是否与运算符*相关?
函数声明与函数指针声明的差异解析
这两种声明的差异完全和运算符*的绑定规则(优先级与结合性)直接相关,核心原因就是C语言里的运算符优先级顺序:
对于
int *func(…..);:
函数调用运算符()的优先级高于一元间接寻址运算符*,所以标识符func会先和()绑定,被解析成一个函数。剩下的*作用在函数的返回值上,说明这个函数的返回类型是int*(指向int的指针)。简单说,这就是个返回指针的函数。对于
int (*func)(….);:
这里的括号()强制改变了优先级,让*先和func绑定,把func声明成一个指针类型。后面的()则说明这个指针指向的是一个返回值为int类型的函数。这就是标准的函数指针声明。
举个实际使用的例子:
- 第一种声明的函数调用:
int *p = func(42);—— 调用func,得到它返回的int指针。 - 第二种声明的函数指针调用:
int val = (*func)(42);—— 先通过*解引用指针,再调用指向的函数;C语言里也允许简化成func(42),编译器会自动处理隐式解引用,但本质还是调用指针指向的函数。
内容的提问来源于stack exchange,提问作者player
相关产品推荐
相关产品推荐

