https://blog.csdn.net/lixd1210/article/details/104847089

int Func(int x);   /*声明一个函数*/
int (*p) (int x); /*定义一个函数指针*/
p = Func; /*将Func函数的首地址赋给指针变量p*/

方式1

int func(int a, int b) {
cout << "func(int, int)" << a << b << endl;
return 0;
}

//方式1 :声明一种函数类型
typedef int(MY_FUNC)(int, int);

MY_FUNC *fp = NULL;
fp = func;
fp(15, 20);

方式2:函数指针

//方式2 :声明一种函数类型的指针类型
typedef int (*MY_FUNC_P)(int, int);

// 2.方式2举例
MY_FUNC_P fp1 = NULL;
fp1 = func;
fp1(25, 30);

方式3

//方式3 :直接通过指针类型创建,不需用typedef预定义。
int (*fp3)(int, int) = NULL;
fp3 = func;
fp3(27, 89);

下列对函数指针声明描述正确的是
void fptr(int*);
void *fptr(int*);
void (*fptr)(int*); //是
typedef void (*fptr)(int*); //是
typedef void* (*fptr)(int*); //是

数组指针

int arr[] = { 99, 15, 100, 888, 252 };
int *p = arr;

int (*p)[n]; // 数组指针(也称行指针)

int (*a)[10] = &arr; // a指向一个含有10个整数的数组
int (&b)[10] = arr; // b引用一个含有10个证书的数组

指针数组

int *p[n];

// 比如要表示数组中i行j列一个元素:
*(p[i]+j)
*(*(p+i)+j)
(*(p+i))[j]
p[i][j]
int p1[3]; // 数组
int *p2[3]; // 指针数组,数组里的元素是指针类型,是一个由返回整型数据的指针所组成的数组
int(*p3)[3]; // 数组指针 指向了一个数组,数组有3个指针元素

int p4(int); // p4是一个函数
int *p5(int); // p5是一个函数,返回一个指针,所以是指针函数。
int (*p6)(int); // p6是一个函数指针

int (*p7)(int)[3];

int *(*p9(int))[3]; // = int* A[3] A是个指针数组 , A调用 (*p(int))指针函数

int *(*(*p10)(int))[3]; // p 是一个函数指针,这个函数接收一个int 参数,返回一个指针,指向数组,数组有3个元素,元素是 int *

int(*p11(int))[3];