文章目录

函数指针使用笔记

由 hycqwq 发布

在开始之前,我们先复习一下变量指针的内容:

指针是一个变量在内存中的地址,一个变量只对应一个指针,但是可能有多个指针指向一个变量所占的内存空间(因为一个变量可能会占好几个字节,但是每个字节都对应一个指针)。

但是在我们的印象中,函数是一串代码,不应该是存在内存里的呀。

实际上我们的程序在执行的时候也是放在内存里的,所以像函数这样一条条的指令也就有了确切的地址。这样函数也就有了自己的内存地址。

至于怎么用函数指针,我们问一下 GPT。

函数指针是指向函数的指针,它可以指向任意的函数,只要它们的类型和参数列表完全匹配。可以通过函数指针的方式将函数作为参数传递给另一个函数,或者在运行时根据需要调用不同的函数。

定义函数指针的语法为:返回值类型 (*指针变量名)(参数列表),例如:

int (*pFunc)(int, int);  // pFunc是一个指向函数的指针,该函数接受两个int类型的参数,返回int类型的值

使用函数指针调用函数的语法为:指针变量名(参数列表),例如:

int add(int a, int b){  // 定义一个加法函数
    return a + b;
}
int main(){ 
    pFunc = add;  // 将函数add的地址赋值给函数指针变量pFunc
    int result = pFunc(1, 2); // 调用函数指针,将结果赋值给result
    return 0;
}

在上面的示例中,我们定义了一个指向函数的指针 pFunc,并将其赋值为 add 函数的地址。然后我们调用 pFunc 指向的函数,并将其返回值保存在 result 变量中。

函数指针也可以使用 typedef 声明,使代码更易读,如下所示:

typedef int (*pFunc)(int, int);  // 定义一个函数指针类型pFunc
pFunc func = add;  // 使用函数指针类型定义一个函数指针变量func,并将其赋值为add函数的地址

这样我们就可以使用 func 调用 add 函数了。

发现这是个很奇怪的东西,在变量指针中,我们需要使用指针指向的变量的值,需要在前面加一个星号,但是函数指针不需要加。

还有就是它的定义方式非常不正常(?),所以我们再问问 GPT,typedef int (*pFunc)(int, int) 是干什么的:

这段代码使用 typedef 声明了一个函数指针类型 pFunc,它指向一个函数,该函数接受两个 int 类型的参数,返回一个 int 类型的值。

这意味着任何满足这个函数签名要求的函数,都可以赋值给 pFunc 类型的指针变量。

例如,我们可以使用这个函数指针类型定义一个函数指针变量,并将它指向一个名为 add 的加法函数:

int add(int a, int b){
    return a + b;
}
pFunc func = add;  // 使用函数指针类型定义一个函数指针变量func,并将其赋值为add函数的地址

然后我们就可以使用这个函数指针变量来调用 add 函数:

int result = func(1, 2);  // 调用函数指针,将结果赋值给result

这样,我们就可以通过类型别名来使代码更加清晰简洁,并且便于维护和修改。当我们需要更改函数签名时,只需要修改一处即可,不需要在代码中的所有地方都更改函数指针的声明。

所以,这是一个非常奇怪的东西,建议不要使用。

除非是像什么通过输入的字符来决定要使用哪个函数,参数还完全一样的那种。


暂无评论

发表评论