了解函数指针

Understanding function pointers

本文关键字:指针 函数 了解      更新时间:2023-10-16
int f1(){}
int* f2(){}
int main()
{
    int *a;//1
    int b;
    int *c;
    a=c; 
    a=&b; 
    int (*p)(); //2
    p=f2; //showing error
    p=&f1;
}

我希望在我的程序中,"2"的行为必须类似于"1"。为什么函数指针的行为不同。还是我错过了什么?

p=f2;错误,因为类型不兼容。 f2 是一个可以返回int*的函数,而p是指向可以指向返回int函数的函数的指针,例如 f1()

对于int* f2(),您可以定义一个指向函数的指针,如下所示:

 int* (*p2)();   // pointers to function f2
 p2 = f2;

此外,您不需要在函数名称之前使用&,只需函数名称就足够了。这里有一个很好的阅读链接:为什么所有这些疯狂的函数指针定义都有效?这到底是怎么回事?

编辑
有时&functionnamefunctionname不一样,例如 sizeof(functionname)是无效的,而sizeof(&functionname)是完全有效的。

int* f2(){}

一个不接受任何内容并返回指向 int 的指针的函数。

int (*p)();

指向的指针:不接受任何内容并返回 int 的函数

类型不匹配。 p不是指向f2类型的指针

如果你像所有凡人一样难以理解这些定义,请使用螺旋经验法则

>这是一个返回int*的函数

int* f2(){}

所以你需要:

(int*) (*q)();
q = f2; 

>p是指向函数的指针,采用void参数并返回整数。

f1是一个接受 void 参数并返回整数的函数。

f2 是一个采用 void 参数并返回指向整数的指针的函数。

现在,根据定义,您可以看到f1可以分配给pf2不能。要在p中分配f2,应int *(*p)(); p

声明

您做了错误的分配,即不兼容的类型

对于函数

int f1(){}
int* f2(){}

正确的分配是

int (*p)(); 
p = f1;
int* (*p)();
p = f2;