C-复杂的声明的阅读

本文介绍了C语言中复杂的声明如何阅读和理解,通过具体的例子详细解释了如何运用左右法则及优先级规则,来逐步解析复杂声明的具体含义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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内核源码)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值