函数指针、函数指针数组,函数指针数组的指针

数组指针数组

概念:数组指针是指针,只要是指针他就占4个字节;函数

例如: 整形指针:int *p;可以指向整形数据的指针spa

   浮点型指针:float *p;可以指向浮点型的数据的指针设计

那么数组指针,一样的理解就是指向数组的指针。3d

Eg:  int (*p)[10]指针

解释:这里的p因为小括号的缘由和*先结合,因此他就是指针,而后指向的是一个大小为10的整形数组,因此p首先是一个指针,而后指向一个整形数组,即p的名字叫作数组指针。blog

使用:字符串

Int arr[10] = {0};回调函数

此时:arr表示:数组首元素的地址编译

  &arr 表示:数组的地址

咱们运行下面一段代码,获得结果如图:


arr表明数组的第一个元素,因此打印出数组第一个元素的地址

  arr+1表明数组第一个元素向后加一个,获得了的第二个元素,由于是整形数组,因此,地址加了一个4

 &arr+1:由于&arr表明的是整个数组的地址,因此在+1以后,表明的是下一个数组的地址。

 

指针数组

根据数组指针是指针的理解,咱们能够获得,指针数组就是数组,其数组的元素都是指针。

Eg:一个觉得指针数组的定义:int *p[10];

由于[]的结合优先级比较高,因此p先和[]结合

指针数组经常使用来指向字符串,方便字符串的处理

数组参数  指针参数

一维数组的传参:


没有报错,说明图中的传参方式均可以做为一维数组的传参方式

二维数组的传参:

 

当运行这段代码的时候,会出现第一个函数的报错,提示缺乏下标,当咱们在一个函数的参数的第二个中加上二维数组的列数:5,则编译经过,说明二维数组在传参的过程当中是必需要传列数的。

一级指针传参

当一个函数的参数部分是一级指针的 时候,那么此时咱们能够给参数传进去一个地址,由于指针里面就是地址,也能够传进去一个指针,此时编译均可以经过,因此,咱们在必定的程度上就能够把:地址=指针

二级指针传参


在运行如图代码以后,test函数的参数就是接收一个二级指针,在调用的时候,第一次直接传进去一个二级指针:调用成功。由于二级指针里面存放的是一个一级指针的地址,因此咱们在第二次调用的时候,传进去一个一级指针的地址&p,显示调用成功,因此:函数的参数是二级指针的时候,能够接收一个二级指针或者一级指针的地址做为参数。

 

函数指针

首先运行一段代码:


能够看到test &test的值是同样的,因此此时,咱们就能够把test看做是函数的地址,

 

阅读一下代码帮助理解:

Void  test(){

Printf(“hehe\n”);

}

//void (*p1)()

//void *p2()

此时只有p1能够存放函数test的地址,p1先和*结合,说明p1是指针,指针的指向是一个函数,指向的这个函数没有参数,返回值的类型是void

 

函数指针数组:

首先它是一个数组,存放的元素是指针,这些指针都指向某个函数。

则其定义为:

例如:int (*parr1[10])()

首先parr1先和[]结合,他就是数组,那么数组的内容就是int (*)()类型的函数指针

错误实例: int *parr1[10]()×

         int (*)()parr3[10] ×

函数指针数组的用途:转移表

 在咱们设计一个计算器的时候:

 

咱们用函数指针数组,将加减乘除四个函数存放起来,

调用时,咱们能够:*pcal[1](3,2),此时咱们将调用add函数进行32 加运算

 

函数指针数组的指针

既然数组能够用指针指,叫作数组指针,那么函数指针数组也可用指针指起来,叫作:函数指针数组的指针,顾名思义,这个指针指向了一个数组,这个数组叫作函数指针数组,数组里面的元素存放的是函数的指针,这些函数的指针,分别的指向了特定的函数。

如何定义:

Void test (const char *str){}

Int main(){

//定义函数指针pfun

Void (*pfun)(const char *) = test;

//函数指针的数组pfunarr

Void (*pfunarr[5])(const char *str)

//函数指针数组的指针

//void (*(*pfunarr[5]) )(const char *) = &pfunarr;

Return 0;

}

函数指针的应用:回调函数

例如:

Int test(void *str1,void *str2){}

void fun(int x,const char* str,int(*funname)(void *,void*)){

//函数体内部会调用第三个参数传进来的函数,返回值是int,有两个参数,都是void

}

Int main(){

Fun(a,str,test);//此时test函数就当作参数传递到fun函数里面

Return 0

}