函数指针的作用

函数指针的主要作用,就是用来选择不同的调度函数,来满足特殊需求。它的优点,使程序设计更加灵活。缺点:初学者很难理解函数指针,从而引起程序的可读性不高。

1、使用函数指针选择调度函数

复制代码
#include "stm32f10x.h"
#include "USART1.h"
#include "stdio.h"  //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()

void Function1(void)
{
	printf("Function1 work\r\n");
}

void Function2(void)
{
	printf("Function2 work\r\n");
}

void Function3(void)
{
	printf("Function3 work\r\n");
}

void (*FunctionPointer)(void);
//定义一个"函数指针",用来调用传入"void参数"的函数,该函数的返回值为void

int main(void)
{
	int cnt;

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
	USART1_Serial_Interface_Enable(115200);
	printf("\r\nCPU reset\r\n");

	cnt=0;
	while(1)
	{
		cnt++;
		if(cnt>3) cnt=1;
		if(cnt==1) FunctionPointer=Function1;
		//给函数指针赋值,则该函数指针会指向Function1()
		if(cnt==2) FunctionPointer=Function2;
		//给函数指针赋值,则该函数指针会指向Function2()
		if(cnt==3) FunctionPointer=Function3;
		//给函数指针赋值,则该函数指针会指向Function3()
		FunctionPointer();
	}
}

测试结果:

2、使用函数指针数组选择调度函数

复制代码
#include "stm32f10x.h"
#include "USART1.h"
#include "stdio.h"  //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()

void Function1(void)
{
	printf("Function1 work\r\n");
}

void Function2(void)
{
	printf("Function2 work\r\n");
}

void Function3(void)
{
	printf("Function3 work\r\n");
}

void (*FunctionPointerArray[])(void) = { Function1, Function2,Function3 };
//定义一个"函数指针数组",用来调用传入"void参数"的函数,该函数的返回值为void

int main(void)
{
	int cnt;

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
	USART1_Serial_Interface_Enable(115200);
	printf("\r\nCPU reset\r\n");

	cnt=0;
	while(1)
	{
		FunctionPointerArray[cnt]();
		cnt++;
		if(cnt>2) cnt=0;
	}
}

测试结果:

3、将函数指针用作函数的传递参数选择调度函数

复制代码
#include "stm32f10x.h"
#include "USART1.h"
#include "stdio.h"  //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()

void Function(int value)
{
	printf("value=%u\r\n",value);
}

//FunctionPointer是"函数指针",用来调用传入"void参数"的函数,该函数的返回值为void
//将"函数指针"用作传递参数,用来调用不同的调度函数
void callbackFunction(int value, void (*FunctionPointer)(int))
{
	FunctionPointer(value);
}

int main(void)
{
	int cnt;

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
	USART1_Serial_Interface_Enable(115200);
	printf("\r\nCPU reset\r\n");

	cnt=0;
	while(1)
	{
		callbackFunction(cnt,Function);
		cnt++;
		if(cnt>2) cnt=0;
	}
}

4、函数指针和指针函数的区别

函数指针,首先它是一个指针,不是函数;

指针函数首先是一个函数,只是它的返回值是一个指针。

函数指针声明格式:类型标识符 (*函数名) (参数)

void (*FunctionPointer)(void);
//定义一个"函数指针",用来调用传入"void参数"的函数,该函数的返回值为void

指针函数的声明格式为:类型标识符 *函数名(参数表);

char array\[\]="123456\r\n";
char * PointerFunction(char *buf) //这是指针函数

{

buf++;

return(buf);

}

void Test_PointerFunction(void)

{

char *p;

p=PointerFunction(array);

printf("*p=%s",p);

}

复制代码
#include "stm32f10x.h"
#include "USART1.h"
#include "stdio.h"  //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()

/*
函数指针,首先它是一个指针,不是函数;
指针函数首先是一个函数,只是它的返回值是一个指针。

函数指针声明格式:类型标识符 (*函数名) (参数)
指针函数的声明格式为:类型标识符 *函数名(参数表);
*/
void Function(int value)
{
	printf("value=%u\r\n",value);
}

char array[]="123456\r\n";
char * PointerFunction(char *buf)
{
	buf++;
	return(buf);
}

void Test_PointerFunction(void)
{
	char *p;
	p=PointerFunction(array);
	printf("*p=%s",p);
}

//FunctionPointer是"函数指针",用来调用传入"void参数"的函数,该函数的返回值为void
//将"函数指针"用作传递参数,用来调用不同的调度函数
void callbackFunction(int value, void (*FunctionPointer)(int))
{
	FunctionPointer(value);
}

int main(void)
{
	int cnt;

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
	USART1_Serial_Interface_Enable(115200);
	printf("\r\nCPU reset\r\n");
	Test_PointerFunction();

	cnt=0;
	while(1)
	{
		callbackFunction(cnt,Function);
		cnt++;
		if(cnt>2) cnt=0;
	}
}
相关推荐
LaughingZhu1 小时前
Product Hunt 每日热榜 | 2026-05-30
人工智能·经验分享·深度学习·神经网络·产品运营
Li Zi2 小时前
柔性FPC颜色测量仪:小巧精准,万物皆可“取色“
经验分享
爱吃生蚝的于勒2 小时前
QT开发第二章——信号和槽
c语言·开发语言·c++·qt
六bring个六2 小时前
c/c++面试踩坑笔记
c语言·数据结构·c++
智者知已应修善业3 小时前
【分立元件OCL电路】2024-5-17
驱动开发·经验分享·笔记·硬件架构·硬件工程
.千余3 小时前
【Linux】 TCP进阶详解:字节流、粘包问题、异常情况与UDP完整对比2
linux·运维·c语言·开发语言·经验分享·笔记·php
QiLinkOS3 小时前
QiLink 技术委员会选举实施细则
c语言·数据结构·c++·单片机·嵌入式硬件·算法·开源
05候补工程师4 小时前
【英语学习笔记】基于“底层逻辑转换”与“去动词化”的英汉互译核心方法论及写作高分公式
经验分享·笔记·学习·考研
QiLinkOS4 小时前
发明人与专利价值共生逻辑
c语言·数据结构·c++·人工智能·单片机·嵌入式硬件·算法
2501_943205054 小时前
【210期】U盘修复写保护解除工具V1.0
经验分享