c++学习笔记(十五):函数指针

1、先看看是如何定义一个数组类型的:


	//如何定义一个数组类型

	typedef int (MyArrayType)[10];

	MyArrayType myArray; int array[10];
	myArray[0] = 1;

	{
		//如何定义一个数组指针的类型
		int array2[10];
		typedef int (*PMyArrayType)[10];
		PMyArrayType  pmyArray;
		pmyArray = &array2;
		(*pmyArray)[0] = 11;

		{  //类比用指针进行间接赋值
			 int a = 10;
			 int *p = NULL;
			 p = &a;
		}
	}

	{
		int array3[10];
		int (*pM)[10]; //直接定义了一个指针变量,告诉c编译器给我分配4个字节的内存,,这个指针变量指向一个数组。
		//言外之意是:pM++会后移一个数组单位。。。。(4*10)个字节
		pM = &array3;
		(*pM)[0] = 12;

	}

2、因为函数三要素: 名称、参数、返回值,因此C/C++语言中的函数有自己特定的类型。

C语言中通过typedef为函数类型重命名

typedef type name(parameter list)

typedef int f(int, int);

typedefvoid p(int);

函数指针:

函数指针用于指向一个函数

函数名是执行函数体的入口地址

1)可通过函数类型定义函数指针:FuncType* pointer;

2)也可以直接定义:type(*pointer)(parameter list);

pointer为函数指针变量名

type为指向函数的返回值类型

parameter list为指向函数的参数类型列表


//test是函数名,函数名代表函数首地址,函数名就是函数指针 
int test(int a)
{
	printf("a:%d", a);
	return 0;
}
void main()
{
	//定义一个函数类型。。。
	typedef int (MYFuncType)(int);
	MYFuncType *myfun; //函数指针变量
	test(1); //指向一个函数调用

	{
		myfun = test;
		//通过函数指针变量,可以找到函数入口,可以执行函数
		myfun(2);
	}
	{
		//对函数名字&地址,和不取地址,效果一样。。。。
		//历史遗留原因
		myfun = &test;
		myfun(3);
	}

	{
		int ret = 0;
		//定义了一个函数指针类型
		typedef int (*PMYFuncType)(int);
		PMYFuncType  pMyFuncType;

		pMyFuncType = test;
		ret = pMyFuncType(1);
	}

	{
		//直接定义一个函数指针变量。。。。
		int (*PmyFunc)(int) ; //告诉编译器分配4个字节
		PmyFunc = test;
		PmyFunc(11);

	}

	
}


3、函数指针做函数参数

1)、  指针做函数参数pk函数指针做函数参数

回忆指针做函数参数

一级指针做函数参数、二级。。。。、三级

2)、  函数指针做函数参数

当函数指针 做为函数的参数,传递给一个被调用函数,

被调用函数就可以通过这个指针调用外部的函数,这就形成了回调

//子任务写任务的人
int add(int a, int b)
{
	int c ;
	c = a + b;
	printf("func add:%d \n", c);
	return c;
}

int add2(int a, int b)
{
	int c ;
	c = a + b;
	printf("func add:%d \n", c);
	return c;
}

//调用任务的人
int MyOP(int (*MyAdd)(int, int))
{

	MyAdd(3, 4);

	return 0;
}
//我在声明一个类型,申明一个函数指针类型。。。
typedef int(*PMyFuncType)(int , int);

	//
int MyOP2(PMyFuncType pMyFuncType)
{
	
	pMyFuncType(3, 4);

	return 0;
}

//调用任务的人,,分开了。。。。。。
void main()
{
	//定义一个指针变量,函数指针变量
	int (*pAdd)(int , int); 
	//调用方法一:把函数的入口地址复制给pAdd
	pAdd = add;

	//调用MyOP,要求传送一个函数指针类型。。的变量。。。
	MyOP(pAdd);
//调用方法二:直接将函数首地址传送给定义的函数指针变量
	MyOP2(add2);

	system("pause");
}

注:
函数指针做函数参数的本质。
1)不光是把函数入口地址给传送给被调用函数。
2)同时,函数类型,也做了一个接口的约定。(任务类型的约定)
反映到代码上。函数三要素 (参数、返回值)统统的做了一个约定。
这个就函数指针做函数参数的核心思想。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值