Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中获取函数指针的这些方法之间有区别吗?_C_Function_Function Pointers - Fatal编程技术网

在C中获取函数指针的这些方法之间有区别吗?

在C中获取函数指针的这些方法之间有区别吗?,c,function,function-pointers,C,Function,Function Pointers,我在摆弄函数指针,我注意到以下程序有点问题: #include <stdio.h> int operation (int x, int y, int (*fptr)(int, int)) { int z; z = (*fptr)(x, y); return (z); } int add(int a, int b) { return a+b; } int main(int argc, char** argv) {

我在摆弄函数指针,我注意到以下程序有点问题:

#include <stdio.h>

int operation (int x, int y, int (*fptr)(int, int))
{
        int z;
        z = (*fptr)(x, y);
        return (z);
}
int add(int a, int b) {
        return a+b;
}
int main(int argc, char** argv) {
        /* This line */ printf("%d\n", operation(1, 2, add));
}
#包括
整数运算(整数x,整数y,整数(*fptr)(整数,整数))
{
intz;
z=(*fptr)(x,y);
返回(z);
}
整数相加(整数a,整数b){
返回a+b;
}
int main(int argc,字符**argv){
/*此行*/printf(“%d\n”,操作(1,2,add));
}
运行这个程序会得到3个结果,这是应该的

然而,在标有
/*This line*/
的行上,我注意到,若该行被更改为这两个选项中的任何一个,它也会导致3:
printf(“%d\n”,操作(1,2,*add)
printf(“%d\n”,操作(1,2,&add)
(注意添加的星号和符号)

当我尝试诸如
printf(“%d\n”,操作(1,2,*(&add));
printf(“%d\n”,操作(1,2,&(*add));
(我在看到上面的内容后假设)之类的操作时,它也会起作用


我想知道这是为什么,以及这两个选项之间是否有任何区别。这是一个未定义的行为,而我只是运气好,编译器是否认为我所说的所有这些都是指同一件事,或者我不明白这里是否有奇怪的事?

来自ANSI/ISO 9899-1990 C标准,第6.2.2.1节:

函数指示符是具有函数类型的表达式。除非它是sizeof运算符或一元&运算符的操作数,否则类型为“函数返回类型”的函数指示符将转换为类型为“指向函数返回类型的指针”的表达式

这意味着
add
本身被转换为指针。
&add
也是一个指针,根据定义;我认为这就是为什么它被明确排除在上面的段落之外。
*add
经历了双重转换,将函数作为指针取消引用,然后再次将其解释为指针


我不认为编译后的代码会有任何不同。

实际上,函数名只是内存地址的标签,这使得它们像指针一样是地址持有者。因此,在某种程度上,您可以将函数名视为指针。因此,您可以使用与在点上相同的引用运算符也就不足为奇了函数指针。

对于函数指针,
x
*x
是相同的复选框。