解析c的声明语句

在继续探索c指针之前,有必要来解析下c语言中复杂的声明语法。

只需要记住两则:一个原则,一个规则。

原则:先看标示符。

规则:运算符优先级是规则。

举例说明

1.最简单的 int array[3];

结论:array是数组,数组规模是3,元素类型是int。

解析过程:先看标示符:array,只有一个运算符[],那么array就是数组,元素类型是int,完了。

2.难一点的

(1)数组指针 int(*array)[3];

结论:array是一指针,指向一数组,数组规模是3,数组中元素类型int。

解析过程:先看标示符:array,由于使用了括号运算符,只能先解析(*array):说明array是一指针。解析完了的,就可抛弃,那么只剩下[],说明指针指向的是一数组,剩下的不解释了。

(2)指针数组 int *array[3];

结论:array是一数组,数组规模是3,数组中元素类型是int*。

解析过程:先看标示符:array,由于[]优先级高于*,故array先与[]结合:说明array是一数组。只剩下一个*,说明数组中存放的是指针,指针指向的类型是int,也就是说数组中存放的元素类型是int*。

看来只差一个(),意义完全不同。

数组指针和指针数组的内存示意图:

指针数组、数组指针总结

指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。
数组指针:首先它是一个指针,它指向一个数组。在32位系统下永远是占4个字节,至于它指向的数组占多少字节,不知道。它是“指向数组的指针”的简称。

3.再复杂一点的

函数指针 int (*pfun)(int,int);

结论:pfun是一函数指针,即pfun指向一个函数,该函数有两个参数,参数类型是int、int,并且函数的返回值的类型是int。

解析过程:先看标示符:pfun,由于使用了括号运算符,只能先解析(*pfun):说明pfun是一指针。现只剩下(int,int),进一步说明pfun指向的是一函数,该函数有两参数,类型都是int,最后的int,说明函数的返回值类型是int。

4.更加复杂一点

int (pfun[3])(int, void ()(int, int));

是否有眼花缭乱的感觉,运用上面的方法,你会解析出来的。不妨写在评论中,大家比较看看。

关于typedef

typedef的作用是为一个已有的类型取一个新的名字:定义别名。

如,在数据结构与算法系列经常看到

typedef int ElemType;

于是,在可以使用int的地方,也可使用ElemType替代,如语句 ElemType data;同样表达着int data;的含义。

typedef更重要的用处是简化类型名,如

typedef struct node

{

int data;

struct node* lchild;

struct node* rchild;

}Node, *PNode;

这里使用typedef定义了多个别名,自此,可以直接使用Node声明一个结构体类型,使用PNode声明一个指向该结构体类型的指针,结构体类型的成员组成如上所示。

除此之外,typedef也常用于复杂的声明,如

typedef int(*p)(int, char);

解析这种声明的方法是,完全按照上述所讲的c的声明方法解析即可。此处p就是函数指针,该函数原型是int (int, char);

再如,typedef int F(void);

此时,F是函数类型,该函数参数为空,返回int。

故,声明 F f;就是声明了int f(void);

https://www.cnblogs.com/litifeng/articles/7862289.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值