zoukankan      html  css  js  c++  java
  • 娓娓道来c指针 (4)解析c的声明语句

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


    专栏文件夹:


  • 相关阅读:
    SpringMVC总结
    Linux执行.sh文件,提示No such file or directory的问题的解决方法
    eclipse下搭建shell脚本编辑器--安装开发shell的eclipse插件shelled
    Windows下调试hadoop
    【转】Markdown 的一些问题
    【转】论“我”和“我们”
    【转】什么是启发
    【转】Scheme 编程环境的设置
    【转】我为什么离开 Cornell
    【转】Currying 的局限性
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/6770209.html
Copyright © 2011-2022 走看看