一 解读方法
从里面的p开始读,根据优先级先排个序
比如
例一
void (*p[2])(void) p 靠近[] 再而靠近* 再而靠近 (void)
所以顺序是 -> 数组->指针->函数
反过来读 这就是一个 ”函数指针数组“
顾名思义就是一个存着”函数指针“类型数据的数组
例二
void (*((*p1)[2]))(void) p靠近* 再靠近 [] 再靠近 * 再靠近(void)
所以顺序是 -> 指针->数组->指针->函数
反过来读就是 ”函数指针数组指针“
顾名思义就是一个存着(”函数指针“的数组)的指针
接下来我们用代码来还原一下现场
#include <stdio.h>
void a (void) {
printf("1\n");
}
void b (void) {
printf("2\n");
}
int main(int argc, char const *argv[])
{
void (*p[2])(void);
void (*((*p1)[2]))(void);
p[0] = a;
p[1] = b;
for (int i = 0; i < 2; i++) {
p[i]();
}
p1 = &p;
for (int i = 0; i < 2; i++) {
p1[0][i]();
}
return 0;
}
编译运行
可以看到如下效果
√成功
以后人家随便说我们也就可以也就可以随便写!
比如人家要你构建一个 指针数组指针
那我们第一步先把顺序反过来再进行书写
指针数组指针 (*p) + (*p)[] + *(*p)[]
int *(*p)[2]
顾名思义就是一个存着 指针类型数据的数组 的指针
代码验证
#include <stdio.h>
int main(int argc, char const *argv[])
{
int *(*p)[2];
int *p2[2];
int a = 10, b = 20;
p2[0] = &a;
p2[1] = &b;
p = &p2;
for (int i = 0; i < 2; i++) {
printf("%d\n", *p[0][i]);
}
return 0;
}
结果