C语言复杂声明

一个声明:int *p[]

分为四部分:

(1)p

(2)p右面的符号(可以什么都没有)

(3)p左面的符号(可以什么都没有)

(4)最左面的类型说明符

 

解读一个声明先从p开始,然后的顺序是:右左右左右左右左····

看完了p,然后从p的右边开始看符号(因为优先级高的符号 [ ]和 ( ) 是放在右边的),如果有符号,就和p先结合。

看完右边的符号(如果有的话)后,就决定了p是什么,比如p右面是[],那么p就是数组,如果是(),那么p就是函数,如果什么都没有,那么p就是变量。

这时,就到p左边的符号发挥作用了(左边要么是 * ,要么就什么都没有)。

最后发挥作用是则是类型说明符(int,char,long······)。

 

 

实战演示:

 

int (*p)();

先看p
右面,由于有一个括号把p和*括起来,所以这个声明的最内层是(*p),所以p右面没有东西,那么p就是个变量。
左面,(*p)左面是*,所以p是一个指针变量。
右面,(*p)的右面是一个(),所以p这个指针,指向的是函数。
左面,什么都没有了。
最后是类型符,int,所以,p是一个指针变量,指向函数,函数返回值是int类型。

 


char (*(*x())[])();

先看x
右面,(),x是一个函数
左面,*,函数返回值类型是指针
右面,[],函数的返回值是指针,该指针指向数组
左面,*,数组内存放的数据是指针
右面,(),数组内的指针指向的是函数(函数指针)
左面,指针指向的函数的返回值是char

 

char (*(*x[3])())[5];

x
右面,[3],x是一个数组,数组内有三个元素
左面,*,数组内的元素是指针
右面,(),指针指向的函数
左面,*,函数的返回值类型是指针
右面,[5],指针指向的是数组,指向的数组容量是5
左面,char 数组内的元素是char类型

 

最后说一句,真不知道这样的声明定义出来的东西谁能看懂,我反正是不会用的。

 

posted @ 2018-03-17 23:49  feipeng8848  阅读(400)  评论(1编辑  收藏  举报