在学习C语言的过程中,有这么一部分让很多小伙伴头疼。它就是指针。
而今天我们讲述的内容就是指针的一部分:函数指针
今天的任务就是让屏幕前的你读完这篇文章做到真正的理解函数指针。
首先我们要知道什么叫做指针:
指针——指针描述了数据在内存中的位置,标示了一个占据存储空间的实体,在这一段空间起始位置的相对距离值。在 C/C++语言中,指针一般被认为是指针变量,指针变量的内容存储的是其指向的对象的首地址,指向的对象可以是变量(指针变量也是变量),数组,函数等占据存储空间的实体
简而言之,指针就是存储地址的一种变量。
OK,现在我们知道了指针是什么后,我们要开始介绍函数指针。那么到底什么是函数指针呢?
在了解函数指针之前,我们可以首先了解整形指针,字符指针,数组指针然后以此类推,最后了解到函数指针。
int* p;
char* p1;
int(*p)[5];
上面分别是整形指针,字符指针和数组指针。
它们各自的意义是什么呢?
整形指针——指向整形的指针。
字符指针——指向字符的指针。
数组指针——指向数组的指针。
说到这里,聪明的你应该知道函数指针是什么了吧!
没错:
函数指针——指向函数的指针。
现在,我们已经知道了函数指针的意义,那么函数指针中存放的到底是什么东西呢?
以前面的例子为例,整形指针中存放的是一个整形的地址,字符指针中存放的是一个字符的地址。
那么obviously,函数指针中存放的是一个函数的地址。
那么函数的地址应当如何表示呢?
不知道大家是否还记得数组的地址如何表示,我们举一个例子:
int arr[4];
int* pa=arr;
int* pb=&arr;
如上代码所示,pa与pb中存放的是相同的地址。
那么函数的地址和数组也有相同之之处
void test(){
}
int main(){
printf("%p\n",test);
printf("%p",&test);
}
如上述代码,两次打印的地址是相同的,所以函数的地址也有两种表示方式,一个是test型,一个是&test型。
好了,现在我们知道了函数的地址如何表示了,那么函数指针的类型到底如何表示呢?
我们直接公布答案:
int Add(int x, int y) {
return x + y;
}
int main() {
int x = 2;
int y = 3;
int z = Add(2, 3);
int (*p)(int, int) = Add; //函数的地址有两种表达方式 Add &Add
printf("%d\n", z);
printf("%d\n", (*p)(x, y));
return 0;
}
在上述代码中,我们可以看到函数指针类型的表达方式,可以简单的归结为:
(函数返回值类型)(*变量名)(函数传参类型);
我们来出一个简单的题来试一试?
写出下面的test()函数的函数指针。
void test(int a,char b){
}
正确答案:
void (* p)(int ,char);
聪明的你写对了吗?
我们现在知道了函数指针中存放的内容,并且知道了函数指针的类型。现在我们看一下函数指针的简单用法:
如上面的Add函数,
我们定义了函数指针p: int(*p)(int,int)= Add;
那么我们应用这个函数的时候可以这么应用:(*p)(x, y)
不知道屏幕前的你懂了吗?、
最后用两道题实践一下吧!
分析以下代码的含义:
1.(*(void(*)())0)();
2.void (*signal(int,void(*)(int)))(int);
加油!