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);
}
}
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)同时,函数类型,也做了一个接口的约定。(任务类型的约定)
反映到代码上。函数三要素 (参数、返回值)统统的做了一个约定。
这个就函数指针做函数参数的核心思想。