C语言中的复杂声明

在C语言的高级指针中会使用到一些比较复杂的声明,因此理解C语言中的声明的含义很重要,这里有一个诀窍,所有C语言中的声明都可以使用求值的方式一层一层的来分析,把声明当作一个表达式对其进行求值,首先分析一个简单的例子来练一练手:

 

    int  *f();

 

    分析:首先看*f()这个表达式,"()"的优先级比间接访问告,因此首先求值的是f(),此这里可以推断出f是一个函数,然后执行间接访问操作可以推断出f是一个函数,而且这个函数返回一个指针,然后在判断这个类型可以推断出f是一个函数,而且这个函数返回一个指针,这个指针指向一个整形类型。

 

    int  (*f)();

 

    分析:首先看(*f)()这个表达式,因为"()"的优先级相同,因此按从左向右的顺序,首先执行的是(*f),此时可以推断出f是一个指针,然后执行下一个"()",此时可以推断出,f是一个指针,这个指针指向一个函数,接着查看这个声明的类型可以推断出f是一个指针,这个指针指向一个函数,而这个函数返回一个整型值。

 

     int  *(*f)();

 

    分析:首先看*(*f)()这个表达式,最先执行的是(*f)()这个表达式,从上一个分析可以推断出f是一个指针,这个指针指向一个函数,然后执行*(*f)()可以推断出f是一个指针,这个指针指向一个函数,这个函数返回一个指针,最后看声明的类型,推断出f是一个指针,这个指针指向一个函数,这个函数返回一个指针,这个指针指向一个整型类型。

 

     下面考虑数组的情况,还是从最简单的开始

 

     int  f[];

 

     分析:这个很简单,f是一个数组,这个数组中的元素为整型类型。

 

     int  *f[];

 

     分析:首先看*f[]这个表达式,因为下标的优先级比间接访问高,所以函数最先执行的是f[],因此推断出f是一个数组,接着执行*f[]推断出f是一个数组,这数组中的元素是指针,最后查看声明的类型,推断出f是一个数组,这个数组中的元素是指针,这些指针都指向整型类型。

 

    int  f()[];

 

     分析:首先通过f()可以知道f是一个函数,f()[]可以指针这个函数返回一个数组!!!,因此可以判断这个声明是非法的,因为函数只能返回标量不可能返回数组!

 

    int  f[]();

 

     分析:首先f[],f是一个数组,f[]()可以知道f是一个数组这个数组中的元素是函数!!!!,因此也可以判断出此声明是非法的,因为数组中每个元素的长度都是相同的,但是函数不可能每一个长度都相同!

 

    int  (*f[])();

 

     分析:首先(*f[]),f是一个数组,这个数组的元素是指针,(*f[])(),可以知道f是一个数组,这个数组的元素是指针,这些指针都指向函数,在通过声明的类型可以知道,f是一个数组,这个数组中的元素是指针,这些指针指向函数,而这些函数返回整型类型。注意这个声明是合法的,因为数组中的元素是指针,而指针的长度是相同的。如果上面的所有声明都清楚了,那么下面的这个声明将很好理解:

 

     int  *(*f[])(); 这个声明就不在做细致的分析了:f是一个数组,这个数组中的元素是指向返回指向整型元素类型的指针的函数的指针。

 

     以上的所有声明并没有涉及到函数的参数,如果把函数的参数也涉及进来,则也很好理解:

 

     int  *(*f[])( int **pi, char ch );

 

     虽然向上面这样的复杂声明我们可能很少遇见,但是他们却有助于我们理解C语言中的许多原则,所以研究这些复杂声明很有必要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值