在开始之前,我们先复习一下变量指针的内容:
指针是一个变量在内存中的地址,一个变量只对应一个指针,但是可能有多个指针指向一个变量所占的内存空间(因为一个变量可能会占好几个字节,但是每个字节都对应一个指针)。
但是在我们的印象中,函数是一串代码,不应该是存在内存里的呀。
实际上我们的程序在执行的时候也是放在内存里的,所以像函数这样一条条的指令也就有了确切的地址。这样函数也就有了自己的内存地址。
至于怎么用函数指针,我们问一下 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
这样,我们就可以通过类型别名来使代码更加清晰简洁,并且便于维护和修改。当我们需要更改函数签名时,只需要修改一处即可,不需要在代码中的所有地方都更改函数指针的声明。
所以,这是一个非常奇怪的东西,建议不要使用。
除非是像什么通过输入的字符来决定要使用哪个函数,参数还完全一样的那种。