什么是函数指针?
指针前面已经写过好多,自以为认识的差不多了,但是今天突然看到一个问题,写一个函数指
针,函数指针就是一个指向函数首地
址的指针,接下来写几个指针:
写一个函数指针
写一个函数指针数组
写一个指向函数指针数组的指针
看到这三个是不是觉得挺绕~
==》定义函数指针
举个例子看以下代码:
#include<stdio.h>
#include<Windows.h>
void fun()
{
printf("我调用成功了\n");
}
int main()
{
void(*pfun)() = &fun;
(*pfun)();
system("pause");
return 0;
}
运行结果是什么呢?
这个就是一个函数指针的声明。
==》如何定义一个函数指针数组?
以前我写过一个博客介绍数组指针和指针数组的区别,我们应该知道函数指针数组,是每一个元素
为函数指组的数组,对它是数
组。
现在来看看他的用法:
#include<stdio.h>
#include<Windows.h>
void fun1()
{
printf("我调用成功了\n");
}
void fun2()
{
printf("我第二次调用成功了\n");
}
void fun3()
{
printf("我第三次调用成功了\n");
}
int main()
{
void(*pfun)() = &fun1;
void(*pfun2)() = &fun2;
void(*pfun3)() = &fun3;
//接下来就是定义一个数组把他们三个装进去。
void(*pfunarr[3])();
//在这里呢看着个指针数组,他就是一个具有3个以函数指针为内容的元素的函数指针数组。
pfunarr[0] = &pfun;
pfunarr[1] = &pfun2;
pfunarr[2] = &pfun3;
pfunarr[0]();
pfunarr[1]();
pfunarr[2]();
system("pause");
return 0;
}
很多人疑惑那个声明是怎么写出来的,如果你定义一个整形数组呢? int arr[3]。
那么我们刚刚知道函数指针类型 怎么写?
void (*pfun)()
这个函数指针类型想把它变成数组就去找那个名字往它后面加一个[3] 就ok了~
也就是
void(*pfun[3])();
==》定义一个指向 指针数组的指针
上面我们已经发现规律,那我再看如下代码~
#include<stdio.h>
#include<Windows.h>
void fun1()
{
printf("我调用成功了\n");
}
void fun2()
{
printf("我第二次调用成功了\n");
}
void fun3()
{
printf("我第三次调用成功了\n");
}
int main()
{
//void(*pfun)() = &fun1;
//void(*pfun2)() = &fun2;
//void(*pfun3)() = &fun3;
//接下来就是定义一个数组把他们三个装进去。
void(*pfunarr[3])();
void(*(*pfunarr2)[3])();
//在这里呢看着个指针数组,他就是一个具有3个以函数指针为内容的元素的函数指针数组。
pfunarr[0] = &fun1;
pfunarr[1] = &fun2;
pfunarr[2] = &fun3;
pfunarr2 = &pfunarr;
(*pfunarr2)[0]();
pfunarr[0]();
system("pause");
return 0;
}
再看看结果~
我们把那个声明拿下来 分析一下
void (*(*pfunarr2)[3])();
首先呢,把 (*pfunarr2)[3] 这一段代码先去掉。
(*pfunarr2)[3] 这段代码很明显就是一个指针数组的原型。
那么它剩下来的部分是 void (*)() 这个是一个指向函数的指针原型。
所以他两个拼在一起
void (*(*pfunarr2)[3])();
这里这些听起来特别绕,但是呢你自己理解了,它们拿出来其实就都挺简单的喽。