引入
前面,我们学习了,将指针指向变量、指向数组、指向字符数组,今天我们要引入一个新的概念,指针指向函数。
什么是函数指针?
如果程序中定义了一个函数,那么在编译时,编译系统会为函数代码分配一段存储空间,我们称这段存储空间的起始地址
,称为这个函数的指针
。
所以,我们在捋顺一下:
指针指向变量:变量的地址
指针指向数组:数组首元素的地址
指针指向多维数组:数组首行元素的地址
指针指向字符数组:字符数组的首元素地址
指针指向函数:函数存储空间的起始地址
如何定义一个函数指针
函数指针,意味着这个指针指向该函数:
1 | int (*p)(int,int); |
如何用函数指针变量调用函数
我们知道,调用一个函数,直接用函数名调用
即可。现在,我们学习了指向函数的指针变量,我们也可以使用指针变量来调用函数
了。
举个例子
求两个变量之中的较大者,并且返回较大者。
1 |
|
上面是一个很简单的比大小的程序,我们通过 max 这个函数名来调用了 max 函数。我们接着用指针变量方访问这个 max 函数:
1 |
|
我们看到,max 函数本身没有变化,变化的是在 main 函数中主调的时候,不是通过函数名调用,而是通过指针变量的方式调用,不过在调用之前,指针变量定义也需要注意:
1 | int max (int a,int b) |
上面这两个声明必须相同,也就是指针的返回类型和参数类型必须和指向的函数相同。
1 | c=(*p)(a,b); |
不要将(p)(int a, int b)写成 p (Int a,int b),因为这样根据优先级,就成了 *(p(int a , int b))这就成了声明一个 p 函数了。
无论是变量、数组还是函数,传递给指针的只有地址,但是在函数中,我们不能通过移动指针来表示下一条指令。
*(p+1)
这是不对的!
尾巴
这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。