函数指针:
-
定义:
- 普通定义:
- int (*pfunc)(int,int);首先(*pfunc)的优先级最高,所以它是一个指针,它指向的是什么呢?指向的是返回值为int,参数为int,int的函数。
- typedef定义:
- typedef int (*PFUNC_T)(int,int);就这么简单,下面将介绍如何使用typedef定义。
-
例子:
- int add(int a,int b);
- 普通定义的函数指针赋值为:
- int (*pfunc)(int,int) = add(非标准赋值)或者int (*pfunc)(int,int) = &add(标准赋值);(此处&可有可无,如果没有函数会隐式转换为指针,但是标准的是需要写的,比如在C++下面的非静态成员类指针,格式:[数据类型 (类名::*pfunc)(参数) = &类名::函数名;]。
- typedef定义的函数指针赋值为:
- PFUNC_T pfunc_t;//先定义,因为使用了typedef PFUNC_T就相当于一个数据类型了,只不过是自定义的,把它当作int理解就行了
- pfunc_t= add或者pfunc_t= &add;。
-
调用:
- 普通方式第一种调用:
- pfunc(100,100),这个是非标准的。
- 普通方式第二种调用:
- (*pfunc)(100,100),这个是标准的(这里将详细介绍一下,推荐写标准赋值和标准调用,下面的将一笔带过)。
- typedef调用:
- pfunc_t(100,100)或者(*pfunc_t)(100,100)同上面一样。
函数指针数组:
-
定义:
- 普通定义:
- int (*pfunc_array[3])(int,int);首先[]的优先级最高,先与pfunc_array结合就是pfunc_array[3],这是一个有3个元素的数组,这个数组里面是装的上面东西呢?装的是指向int (*)(int,int)的函数指针。
- typedef定义:
- int (*PFUNC_ARRAY_T[3])(int,int);
-
例子:
- int add(int a,int b);
- int sub(int a,int b);
- int mult(int a,int b);
- 普通定义函数指针数组赋值:
- pfunc_array[0] = add或者pfunc_array[0] = &add;
- pfunc_array[1] = sub或者pfunc_array[1] = ⊂
- pfunc_array[2] = mult或者pfunc_array[2] = &mult;
- typedef定义函数指针数组赋值:
- PFUNC_ARRAY_T pfunc_array_t;//这里需要先定义一下
- pfunc_array_t[0] = add或者pfunc_array_t[0] = &add;
- pfunc_array_t[1] = sub或者pfunc_array_t[1] = ⊂
- pfunc_array_t[2] = mult或者pfunc_array_t[2] = &mult;
-
调用:
- 普通调用:
- pfunc_array[0](100,100)或者(*pfunc_array[0])(100,100);
- typedef调用:
- pfunc_array_t[0](100,100)或者(*pfunc_array_t[0])(100,100)
指向函数指针数组的指针:
-
定义:
- 普通定义:
- 第一种方法:
- int (*(*pfunc_a_p_1)[3])(int,int);这句话是什么意思?我们先来理解一下,首先(*pfunc_a_p_1)的优先级最高,这里就是一个指针,然后指向的是什么呢?接下来再看把(*pfunc_a_p_1)给去掉就是它所指向的内容了,int (*[3])(int,int),这里我们就知道了,(*pfunc_a_p_1)指向的是一个保存着3个元素的数组,数组里面存放的是指向返回值为int,参数为int,int的函数指针。
- 第二种方法:
- int (**pfunc_a_p_2)(int,int);
- typedef定义:
- 第一种方法:
- typedef int (*(*PFUNC_A_P_1_T)[3])(int,int);
-
第二种方法:
-
typedef int (**PFUNC_A_P_2_T)(int,int);
-
-
例子:
- 上面我们定义了一个int (*pfunc_array[3])(int,int);的函数指针数组
- 普通定义指向函数指针数组的指针赋值:
- 第一种方法:
- int (*(*pfunc_a_p_1)[3])(int,int) = &pfunc_array;注意这里需要&pfunc_array
- 第二种方法:
- int (**pfunc_a_p_2)(int,int) = pfunc_array;
- typedef定义指向函数指针数组的指针赋值:
- 第一种方法:
- PFUNC_A_P_1_T pfunc_a_p_1_t = &pfunc_array;
- 第二种方法:
- PFUNC_A_P_2_T pfunc_a_p_2_t = pfunc_array;
-
调用:
- 普通定义调用:
- (*pfunc_a_p_1[0])(100,100);
- (*pfunc_a_p_2)(100,100);
- typedef定义调用:
- (*pfunc_a_p_1_t [0])(100,100);
- (*pfunc_a_p_2_t )(100,100);