首页 > 其他分享 >C语言 - 函数指针

C语言 - 函数指针

时间:2023-10-10 11:34:35浏览次数:30  
标签:typedef return int void C语言 printf 函数指针

1.基本概念

函数指针:首先它是一个指针,一个指向函数的指针,在内存空间中存放的是函数的地址;

 

1.1 函数指针的定义形式

函数指针的定义函数的返回值类型(*指针名)(函数的参数列表类型)

 

1.2 函数指针的使用方法

#include <stdio.h>

//返回两个数中的最大值
int max(int a, int b) 
{
    return a > b ? a : b;
}

int main()
{
    int x = 100;
    int y = 200;
    int maxval = 0;

    //定义函数指针
    int (*pmax)(int, int) = max;  //也可以写作int (*pmax)(int a, int b)

    //使用函数指针去调用函数
    maxval = pmax(x, y); //写法1
    //maxval = (*pmax)(x, y);//写法2
    printf("Max value: %d\n", maxval);

    return 0;
}

 第 14 行代码对函数进行了调用。pmax 是一个函数指针,在前面加 * 就表示对它指向的函数进行调用。注意( )的优先级高于*,第一个括号不能省略

程序运行结果:

1.3 函数指针充当函数参数

下面实现了一个简单的回调函数

#include <stdio.h>

int Max(int a, int b)
{
	return a > b ? a : b;
}
int Min(int aa, int bb)
{
	return aa > bb ? bb : aa;
}
int Sum(int a, int b)
{
	return a + b;
}
//以函数指针充当函数参数
void callback(int(*pFun)(int, int), int a, int b)
{
	printf("%d\n", pFun(a, b));//函数指针调用
}

int main()
{
	//函数指针充当函数参数
	//回调函数: 统一接口
	callback(Max, 1,2);			//最大值
	callback(Min, 3,4);			//最小值
	callback(Sum, 1,1);			//求和
	return 0;
}

 

1.4 函数指针充当函数返回值

#include <stdio.h>


int Max(int a, int b)
{
	return a > b ? a : b;
}

//这样写会报错!编译器解析不了函数的返回值,需要使用typedef给函数指针起别名
//int(*p)(int, int) returnFunction(int(*pf)(int, int), int a, int b)
//{
//	return pf;
//}

//函数指针起别名
typedef int(*PFUNC)(int, int);

//函数指针充当函数返回值
PFUNC returnFunction(PFUNC pf, int a, int b)
{
    printf("%d\n", pf(a, b));
    return pf;
}


int main()
{
	PFUNC p = returnFunction(Max, 1, 2);
	printf("%d\n", p(5, 6));

	return 0;
}

 

1.5 使用typedef给函数指针起别名

#include <stdio.h>

//1.给简单数据类型别名
typedef int 整数;
//2.给数组起别名
typedef int ARRAY[3];
//万能看typedef语句
//1.直接用别名定义的名字替换别名
//typedef int array[3];
//2.去掉typedef 剩下就是你定义的东西
// int array[3]
typedef int ARRAY2D[2][2];
int  Max(int a, int b) 
{
	return a > b ? a : b;
}
//3.函数指针起别名
typedef int(*PFUNC)(int, int);
//函数指针充当函数参数
PFUNC returnFunction(PFUNC pf, int a, int b) 
{
	printf("%d\n", pf(a, b));
	return pf;
}

int main() 
{
	int iNum = 1;
	整数 iNum2 = 2;
	ARRAY array;		//int array[3]
	for (int i = 0; i < 3; i++) 
	{
		array[i] = i;
		printf("%d\t", array[i]);
	}
	printf("\n");
	ARRAY num[2];		//int num[2][3];
	ARRAY2D array2D;	//int array2D[2][2];
	PFUNC pf = NULL;
	//int(*pf)(int, int)=NULL;
	//很少见,基本不这样用,函数指针更多的使用方式是: 调用函数,充当函数参数
	pf = returnFunction(Max, 1, 2);
	printf("%d\n",pf(100, 200));
	//上面两句话等效下面一句话
	int result = returnFunction(Max, 1, 2)(100, 200);
	printf("%d\n", result);

	return 0;
}

 

1.6 复杂的函数指针

#include <stdio.h>

//void(*p)();   去掉变量名剩下就是指针: void(*)()
void print() 
{
	printf("空类型的指针充当函数指针\n");
}
int Max(int a, int b) 
{
	return a > b ? a : b;
}
int Sum(int  a, int b) 
{
	return a + b;
}
void printData(int(*pMax)(int, int), int a, int b) 
{
	printf("%d\n", pMax(a, b));
}
//void printData(int(*pMax)(int, int), int a, int b)
//void (*p)(int(*pMax)(int, int), int a, int b)
//void(*p)(int(*)(int, int),int,int)
//以一个以函数指针为参数的函数指针为参数的函数
void userPrint(void(*p)(int(*)(int, int),int,int), int(*pMax)(int, int), int a, int b) 
{
	p(pMax, a, b);
}
int main() 
{
	//1.万能指针充当函数指针
	void* pVoid = NULL;
	//使用前必须做类型转换
	pVoid = print;    //print的类型: void(*)();
	((void(*)())pVoid)();
	(*(void(*)())pVoid)();
	//2.以一个以函数指针为参数的函数指针为参数的函数
	userPrint(printData, Max, 1, 2);
	userPrint(printData, Sum, 1, 2);
	void (*pFunc)(void(*)(int(*)(int, int), int, int),
		int(*)(int, int),
		int, int) = NULL;
	pFunc = userPrint;
	pFunc(printData, Sum, 100, 200);
	//3.函数指针数组:多个函数指针的集合
	int (*pMax)(int, int) = NULL;
	int(*pArray[2])(int, int);
	typedef int(*pXX)(int, int);
	pXX X[2];
	X[0] = Max;
	X[1] = Sum;
	//int *array[2];
	pArray[0] = Max;
	pArray[1] = Sum;
	for (int i = 0; i < 2; i++) 
	{
		printf("%d\n",pArray[i](100, 200));
	}
	typedef int(*B)(int, int);
	typedef int(*C)(int, int);
	typedef void(*A)(B b, int, int);
	void (*pFunc)(A a,C c,int, int) = NULL;
	//void XXX(A a, C c,int d,int e);
	return 0;
}

 

标签:typedef,return,int,void,C语言,printf,函数指针
From: https://www.cnblogs.com/zhuchunlin/p/17754236.html

相关文章

  • C语言 - 万能指针
    1.什么是万能指针?万能指针其实就是void*类型的指针,而void*指针一般被称为通用指针或叫泛指针。它是C语言关于纯粹地址的一种约定。当某个指针是void型指针时,所指向的对象不属于任何类型。因为void指针不属于任何类型,不可以对其进行算术运算,比如自增,编译器不知道其自增需要增......
  • 【C语言入门】第十天
    【例题1】1108.IP地址无效化-力扣(LeetCode)char*defangIPaddr(char*address){intlen=strlen(address);char*p=(char*)malloc(sizeof(char)*len+6+1);inti,j;for(i=0,j=0;i<len;i++){if(address[i]=='.'){j+......
  • C语言没人教但必须了解的技巧
    前言工作了一年,对于代码的理解更进了一步,标准且好用的c代码能够使开发效率更上一层楼,这里整理了一下最近看到的一些c代码技巧,能使c代码编写更加标准化。参考文章地址:C语言中常用的宏定义(qq.com)C语言位操作符8个常用的小技巧(qq.com)宏定义类1.防止重复定义防止头文件......
  • C语言 - malloc与free函数
    C 内存管理本章将讲解C中的动态内存管理。C语言为内存的分配和管理提供了几个函数。这些函数可以在 <stdlib.h> 头文件中找到。在C语言中,内存是通过指针变量来管理的。指针是一个变量,它存储了一个内存地址,这个内存地址可以指向任何数据类型的变量,包括整数、浮点数、字......
  • 今天就差不多完成了ai编码c语言程序的过程
    不断改进的提示语:writeaprogramincandcompilebygcc,createasystemtrayicon,whentheiconisrightclicked,popupanexitmenutoexittheprogram,listeninbackgroup,whenkeycombinationCtrl+LeftArrowispressed,getcurrentactivewindowinwi......
  • C语言 模拟用户登陆场景只允许登录三次,错误三次后退出登录
    intmain(){inti=0;charpassword[20]={0};for(i=0;i<3;i++){printf("请输入密码:");scanf("%s",password);if(strcmp(password,"123")==0){printf("登陆成功\n");break;}else......
  • C语言使用%d读入字符会发生什么
    指定了%d来读取一个整数,scanf()函数开始每次读取一个输入字符,它跳过空白字符(包含空格、制表符和换行符)直到遇到一个非空白字符,并期望发现一个数字字符或者一个符号(+或者-)。如果发现一个数字或符号,那么就保存并读取下一个字符;如果接下来的字符是一个数字,再保存,继续读取。如此持......
  • 实验1 C语言输入输出和简单程序编写
    实验任务1(1)1#include<stdio.h>2intmain(){3printf("O\n");4printf("<H>\n");5printf("II\n");6return0;7}结果演示(2)1#include<stdio.h>2intmain(){3printf(&quo......
  • 学习C语言心得-do...while循环
    do....while(上来就干!)习题:打印1-10数字#include<stdio.h>//打印1-10intmain(){ inti=1; do { printf("%d",i); i++; } while(i<11); return0;}运行结果:continue中i++放置位置区别:1,i++在continue后方:#include<stdio.h>//打印1-10intmain()......
  • c语言代码练习(与“&”)26
    需求:求一个整数存储在内存中二进制中的1的数量#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>intmain(){intnum=0;intinput=0;printf("请输入你想要统计的数字:");scanf("%d",&input);inti=0;for(i=0;i<32;i+......