在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
是相同的复选框。