有人说 自己已经「学完C语言」 我就顺手写了一个东西 问他什么意思 明显嘛 看不懂

东西是这个 比我当时写的又加了一个括号 注意这个是可以编译通过的

1
int (*a[1])(void (*a[2])(int (*a)[3]));

我来简单解释一下 顺便传授一下方法

首先 这个是C语言里面定义函数指针的语法 难点是 因为函数有参数 而参数的类型也必须写在里面 所以会非常长 道行浅的「学完C语言」的人基本上是看不出来的 其实很简单 首先抓住主要矛盾 这个是什么 从前往后 从外往里找最合法的部分 发现是这个

1
int (*a[1])(...)

去掉[1]就是函数指针 这里加上[1]是函数指针的数组 所以 变量a是有一个元素的函数指针的数组 每个元素都是一个函数指针 这个函数的返回值是int

再看里面 也是一个函数指针的数组 这个是作为参数的

1
void (*a[2])(int (*a)[3])

类似的 这是有两个元素的函数指针的数组 每个元素都是一个函数指针 函数指针指向的函数的返回值是void 接受一个参数 这个参数是一个指向了有3个元素的数组 数组的类型是int

合起来就是

  • 定义了一个变量a

  • 变量a是有一个元素的函数指针的数组

  • 每个元素都是一个函数指针 这个函数的返回值是int

  • 这个函数指针指向的函数接受一个参数

  • 这个参数也是一个函数指针的数组 有两个元素

  • 每个元素都是一个函数指针 函数指针指向的函数返回值是void 接受一个参数

  • 这个参数是一个指向了又三个元素数组的数组指针 数组的类型是int

简化一下是 函数指针数组 函数的参数也是函数指针数组 内层的参数是数组指针

如果你觉得有问题 欢迎指正