gpt4 book ai didi

c - 使用函数指针的正确风格是什么?

转载 作者:行者123 更新时间:2023-12-04 11:03:42 25 4
gpt4 key购买 nike

抱歉,我对使用函数指针有点困惑。我输入了 3 个以不同方式使用函数指针的函数,但令人难以置信的是它们都有效。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>

typedef int(*pfun)(int a, int b);

int add(int a, int b)
{
return a + b;
}

int f1()
{
pfun fun = add;
return fun(3, 4);
}

int f2()
{
pfun fun = &add; //Why did't compiler report an error?
return fun(3, 4); //Why it could work? The value in fun should be a pointer of function pointer.
}

int f3()
{
pfun fun = &add;
return (*fun)(3, 4); //Why did't compiler report an error?

}

int main()
{
printf("%d,%d,%d\n", f1(),f2(),f3());
system("pause");
return 0;
}

输出为 7,7,7,在 VS2017 中没有编译错误。

最佳答案

f2你的评论是错误的。 &add不可能是指向指针的指针;它指向什么指针对象?同样,给定 char array[N]; , &array不是指针到指针。它具有指向数组的指针类型。在大多数上下文中,函数和数组类型标识符都计算为指针(分别为函数指针或指向第一个元素的指针),但这并不意味着它们本身具有指针类型。

f3 , *fun是一个对函数求值的表达式,它总是隐式地转换为指向该函数的指针。根本就没有带有函数类型的表达式这样的东西。因此,****************fun也评估为与 fun 相同的东西(指向 add 的指针)。

注意函数调用运算符()将具有函数指针类型的表达式作为其操作数。每当您通过标识符调用函数时,您都在使用函数指针。

根据语言,这些形式中没有一个比任何其他形式更“正确”,但我认为大多数 C 程序员发现使用 &*操作符充其量是冗余的(如果不是误导)函数,并且会考虑 f1最好的。

关于c - 使用函数指针的正确风格是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52453287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com