(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);

专栏文件夹:

娓娓道来c指针 (4)解析c的声明语句的更多相关文章

  1. 娓娓道来c指针 (0)c语言的梦魇:c指针

    (0)c语言的梦魇:c指针 序 c语言中有一个重点:c指针.它也是一个难点.当然,这是一句废话:重点往往也是难点.在c标准中,对指针的定义是这种: 指针的类型是derived from其他类型,也就是 ...

  2. 娓娓道来c指针 (3)指针和数组

    (3)指针和数组 在c中指针和数组似乎有着千丝万缕的关系.事实上它们不是一回事:指针是指针,数组是数组.两者不同样. 说它们有关系,只是是由于常见这种代码: int main() { int arra ...

  3. 你不知道的JavaScript--Item6 var预解析与函数声明提升(hoist )

    1.var 变量预编译 JavaScript 的语法和 C .Java.C# 类似,统称为 C 类语法.有过 C 或 Java 编程经验的同学应该对"先声明.后使用"的规则很熟悉, ...

  4. C指针的解析

    这是我从网上转载的一篇关于C指针的文章,方便自己以后回顾,自己添加修改部分内容 ,不对请指正 Attention:指针是指针变量 ,数组是指针常量 第一章 指针的概念  指针是一个特殊的变量,它里面存 ...

  5. 娓娓道来c指针 (2)内存分配

    (2)内存分配 c语言中描写叙述变量的时候经常使用的两个用语 1.作用域:也叫可见域,指的是变量的作用范围. 在哪个范围内.该变量是可见的.能够使用的. 2.生存期:也叫存储期.指的是变量从创建到销毁 ...

  6. C语言声明语句

    设计理念: C语言的一个设计理念就是声明变量和使用变量的形式应该是一致的 优点:声明变量和使用变量时的运算符优先级是相同的 缺点:运算符的优先级是C语言过度解析的部分之一 术语: 变量声明中使用到的符 ...

  7. JS006. 详解自执行函数原理与数据类型的快速转换 (声明语句、表达式、运算符剖析)

    今天的主角: Operator Description 一元正值符 " + "(MDN) 一元运算符, 如果操作数在之前不是number,试图将其转换为number. 圆括号运算符 ...

  8. javascript语句——表达式语句、块语句、空语句和声明语句

    × 目录 [1]表达式 [2]块语句 [3]空语句[4]声明 前面的话 如果表达式在javascript中是短语,那么语句(statement)就是javascript整句或命令.表达式计算出一个值, ...

  9. JS声明语句提升与作用域

    <!DOCTYPE html><html><head></head><body><script>//-------------- ...

随机推荐

  1. [TC6194]AllWoundUp

    [TC6194]AllWoundUp 题目大意: 有\(A\)和\(B\)两个人.\(A\)在平面上游走,\(B\)会一直盯着\(A\)看,站在\(x\)轴某个位置上不动,并随着\(A\)的运动旋转身 ...

  2. SpringMVC集成Swagger插件以及Swagger注解的简单使用

    一.简介 Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新 .接口的方法,参数和模型 ...

  3. 【BZOJ】4709: [Jsoi2011]柠檬

    4709: [Jsoi2011]柠檬 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 779  Solved: 310[Submit][Status][ ...

  4. bzoj 1015 维护连通块个数,离线并查集

    水. /************************************************************** Problem: 1015 User: idy002 Langua ...

  5. IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) E. Bear and Forgotten Tree 2 bfs set 反图的生成树

    E. Bear and Forgotten Tree 2 题目连接: http://www.codeforces.com/contest/653/problem/E Description A tre ...

  6. 九月回顾 这篇文章和ACM毫无关系= =

    其实不只是九月的回顾吧,我大概想把暑假到现在10.01发生的啥事儿都说下吧~ 嗯,我是一个比较沙茶的人,不过运气比较好吧. 高中啊,这个谈起来话就长了,在校什么风采之星大赛上,我认识了个妹子,当时感觉 ...

  7. Computer Vision Tutorials from Conferences (3) -- CVPR

    CVPR 2013 (http://www.pamitc.org/cvpr13/tutorials.php) Foundations of Spatial SpectroscopyJames Cogg ...

  8. JVM内存参数详解以及配置调优

    基本概念:PermGen space:全称是Permanent Generation space.就是说是永久保存的区域,用于存放Class和Meta信息,Class在被Load的时候被放入该区域He ...

  9. Qt Creator怎样更改默认构建目录

    用过VS的朋友都知道,用VS编译工程时会将生成的可执行文件放在当前工程目录下,使每个工程独立地成为一个整体,管理起来颇为方便:而Qt Creator则不同,编译程序时会创建一个与当前工程目录同级的构建 ...

  10. Mysql客户端中文乱码问题解决

    另一篇一样的: http://www.cnblogs.com/charlesblc/p/5973488.html 在Linux机器上使用Mysql客户端访问获取中文有时候是乱码,如下: mysql&g ...