博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
娓娓道来c指针 (4)解析c的声明语句
阅读量:5170 次
发布时间:2019-06-13

本文共 1623 字,大约阅读时间需要 5 分钟。

                         (4)解析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/claireyuancy/p/6770206.html

你可能感兴趣的文章
Application Pool Identities
查看>>
2017-3-24 开通博客园
查看>>
【MySQL性能优化】MySQL常见SQL错误用法
查看>>
Vue2全家桶之一:vue-cli(vue脚手架)超详细教程
查看>>
Struts 2 常用技术
查看>>
树形DP
查看>>
python flask解决上传下载的问题
查看>>
语法测试
查看>>
CES1
查看>>
CES2
查看>>
文件方式实现完整的英文词频统计实例
查看>>
ListControl的用法
查看>>
单个SWF文件loading加载详解(转)
查看>>
SQLServer中的CTE通用表表达式
查看>>
C# 3.0 LINQ的准备工作
查看>>
CodeForces - 449D Jzzhu and Numbers
查看>>
mysql批量插入更新操作
查看>>
静态代码审查工具FxCop插件开发(c#)
查看>>
创建代码仓库
查看>>
理解裸机部署过程ironic
查看>>