本片文章中我们在分析过程中要严格按照"括号优先,先右后左,由近及远"的规则进行!!!
类型辨析1
1.int a:一个整型变量a
2.int *a:先看*a,表示a是指针类型,再看int 表示a指向整型的存储区
3.int** a:先看*a,表示a是指针类型,再看int*,表示a指向整型指针的存储区,即a存储的是整型指 针类型存储区的地址
4.int a[3]:表示a是一个包含3个整型元素的数组
5.int* a[3]:先看a[3],表示a是一个具有3个元素的数组,再跟*结合表示a中的三个元素都是指针类 型,再看int即表示每个指针都指向整型数据类型的存储区。这其实是一个指针数组。
6.int (*a)[3]:有括号先看(*a)这表示a是一个指针,再结合右边(*a)[3],表示a这个指针指向一个具有3个数据元素的数组,再结合int看,这表示a指向一个具有3个数据元素的整型数组。这其实是一个数组指针。
7.int a(int):不难看出这是一个函数声明,先看a(int),这表示a这个函数有一个整型的形参,再结合interesting,这表示a这个函数的返回值是整型。
8.int* a(int):首先看a(int),这表示a是一个形参为int的函数,再结合*这表示函数返回值为指针类型,再结合int,这表示函数返回值是一个整型的指针。
9.int* (*a)(int *):从形式上看这是一个典型的函数指针,我们来分析一下。按照规则先看括号(*a)这表示a是一个指针,然后向右结合(*a)(int *)这表示指针a指向一个形参为int* 类型的函数,再结合int* ,表示指向的这个函数的返回值为int*类型
类型辨析2
1.typedef int *pfun_t:这个定义将 pfun_t
作为一个指向 int
的指针类型。换句话说,pfun_t
是一个 int *
类型的别名。
2.typedef int (*pfun_t):这个定义将 pfun_t
作为一个指向函数的指针类型,这个函数返回 int
类型。
取别名辨析
1.typedef int data_t:先看data_t,再看int,data_t为int的别名,因此int a和data_t a他俩效果一 样。
2.typedef int* data_t:先看data_t,再看int*,data_t为int*的别名,因此int *p和data_t p他俩效果一 样。(另一种理解是先看*data_t,表示data_t是一个指针,再看int,表示这个指针存储整型数据的地址,即data_t是int*类型,因此int *p和data_t p他俩效果一样)
3.typedef int** data_t;先看data_t,再看int**,data_t为int**的别名,因此int** pp和data_t pp他俩效果一样。(另一种理解是先看*data_t,表示data_t是一个指针,再看int *,表示这个指针存储int*类型数据的地址,即data_t是int**类型,是一个二级指针,因此int **pp和data_t pp他俩效果一样)或者是先看*data_t,表示data_t是一个指针,再看 *,表示这个data_t指针存储指针的地址,再看int,表示这个data_t指针存储整型指针的地址。
4.(需重点理解)typedef int(*data_t)(int,int),他的理解方式较前面有所区别,data_t是int(*)(int,int)这个函数指针的别名,int(*pfunc)(int,int)他是一个典型的函数指针的声明,而data_t pfunc表示 pfunc是函数指针类型的变量。因此int(*pfunc)(int,int)和 data_t pfunc效果也是一样的。
回调函数
回调函数是一种通过函数指针调用的函数。函数指针可以指向某个函数,并且可以在需要的时候调用这个函数。
回调函数的使用步骤
-
定义函数指针类型:首先需要定义一个函数指针类型,这个类型应该与回调函数的原型相匹配。
-
实现回调函数:实现一个符合上述原型的具体函数。
-
注册回调函数:在需要调用回调函数的地方,将回调函数的地址赋值给函数指针。
-
调用回调函数:通过函数指针调用回调函数。
回调函数示例:
#include <stdio.h>
//函数指针
typedef int (*pfun_t)(int, int);
//别名是pfun_t,是函数指针类型的别名
int add(int x, int y) {
return x + y;
}
int sub(int x, int y) {
return x - y;
}
int calc(int x, int y, pfun_t p) {
// p-->add 通过函数指针p可以调用函数add
int res = p(x,y);
return res;
}
int main() {
printf("3 + 2 = %d\n",calc(3,2,add));
printf("3 - 2 = %d\n", calc(3, 2, sub));
return 0;
}