C语言—理解函数指针以及它的用法

什么是函数指针?



指针前面已经写过好多,自以为认识的差不多了,但是今天突然看到一个问题,写一个函数指 针,函数指针就是一个指向函数首地

址的指针,接下来写几个指针:


写一个函数指针

写一个函数指针数组

写一个指向函数指针数组的指针

看到这三个是不是觉得挺绕~


==》定义函数指针




举个例子看以下代码:

#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])();

就叫做指向函数指针数组的指针。

这里这些听起来特别绕,但是呢你自己理解了,它们拿出来其实就都挺简单的喽。


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值