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

来源:互联网 发布:wps mac 编辑:程序博客网 时间:2024/05/21 22:34

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); //调用方法一:把函数的入口地址复制给pAddpAdd = add;//调用MyOP,要求传送一个函数指针类型。。的变量。。。MyOP(pAdd);//调用方法二:直接将函数首地址传送给定义的函数指针变量MyOP2(add2);system("pause");}

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

0 0
原创粉丝点击