C-复杂的声明的阅读

来源:互联网 发布:淘宝摄影发展趋势 编辑:程序博客网 时间:2024/05/17 08:58

C-复杂的声明的阅读

C语言中有许多魔鬼般的声明,让人看到就害怕, 比如:
int ((*p)(int))[5];
这里p是个什么玩意你知道吗??
其实,对于C语言中的复杂声明,我们只要掌握了一定阅读原则,想知道这个声明到底声明什么东西就很简单了

  • 阅读原则
    • 前提: 他们的优先级你应该知道
      • 数组的[]与函数的()有同样的优先级
      • []与()都是从左到由进行结合的
        • 的优先级低于 []与(), 但是()会使*具有更高的优先级
    • 阅读复杂声明的左右法则
      • 从最里层的圆括号中未定义的标识符开始看
      • 首先往右看,再往左看
      • 当遇到()或者[]可以来确实能够部分类型,并调转方向
      • 重复步骤2,3, 直到阅读结束

以 int (func)(int) 为例
这里写图片描述

下面再来看几个复杂的声明:
1) int (p2)(int, int(f)(int)); p2是一个函数指针
-> p2是一个指针, 指针指向一种函数, 函数的类型为: 返回值为int, 参数分别为一个int* 指针, 和一个函数指针f, f指向的函数类型为:返回值为int, 参数类型为int*
2) int (p3[5])(int) p3是一个指针数组
->p3是一个数组, 数组中的每个元素都是指针,指向函数, 函数的类型为:返回值为int, 参数为int*
3) int ((*p4)[5])(int) p4是一个数组指针
-> p4是一个指针,指向一个有5个元素的数组, 数组中的每个元素都为指针,且指向函数类型为:返回值为int, 参数为int*的函数。
4) int ((*p5)(int))[5] 即p5一个3级指针数组,数组的元素个数为5
->p5是一个指针,指向的类型为int*,然后再个p5的指针升一级, p5变成3级指针,指向一个数组,数组的元素类型为int

这些复杂的声明,估计也就在面试题,或者一些NB代码时可能遇到(比如linux内核源码)

0 0