zoukankan      html  css  js  c++  java
  • 读懂复杂C声明的黄金法则

    在网上遇见felix,他让我读 http://www.felix021.com/blog/read.php?2072,读完之后觉得收获很大,需要练习一下。

    黄金法则:从声明的变量开始,先向右看,再向左看,再向右看,再向左看 。。。

    如果向右看的时候遇到),则一直向左看,直到遇到(跳出这层括号。然后再重复向右看,向左看。

    举例说明:

    例子1

    int a; 

    a 的右边什么都没有,向左看int,说明a是一个int型变量。

    例子2

    char *a;

    向右看,什么都没有; 向左看是*, 说明a是一个指针; 再向右看,什么都没有; 再向左看是char,说明a是一个指向char的指针。

    例子3

    int *a[];

    向右看,[]说明a是一个数组;向左看,*说明数组的每个元素是个指针;再向右看,什么都没有; 再向左看,int,每个指针指向一个整数。综合来看,a是一个数组,数组每个元素指向整数。

    例子4

    int * const a;

    向a右边看,什么都没有。一直向左看,先是const,说明a是不可修改的,然后是*,说明a是一个指针;然后是int,说明指针指向整数。综合来看,a是一个不可修改的指针,它指向整数。

    例子5

    void (*checkout)();

    向右看,遇见)返回,再向左看是*,说明checkout是个指针。再向右看,是(),说明这个指针指向函数; 向左看是void,说明函数返回void。总的来看, checkout是一个指向返回void的函数的指针。

    例子6

    void (*checkout[])()

    向右看,[]说明checkout是一个数组;向左看, *说明数组每个元素是个指针。向右看,遇见)返回;再向左看,遇见(返回。再向右看,是(),说明数组内每个指针指向函数; 向左看是void,说明每个函数返回void。

    总的来看, checkout是一个数组,数组内都是指向返回void的函数的指针。

    例子7

    void (*(*checkout)[])()

    向右看,遇见)返回; 向左看,*说明checkout是个指针,遇到(跳出一层()。向右看,[]说明checkout指向的是一个数组;向左看, *说明数组每个元素是个指针。向右看遇见),向左看遇见(,跳出一层()。向右看,()说明数组每个元素指向一个函数;再向左看,void说明每个数组元素指向的函数返回void。

    总结:checkout是一个指针,指向一个数组,每个数组元素都是一个指向返回void函数的指针。

    我了个去,有点头大了。据说c++的面向对象和多态就是靠函数指针和函数指针数组实现的。

  • 相关阅读:
    第11组 Beta版本演示
    第11组 Beta冲刺(5/5)
    第11组 Beta冲刺(4/5)
    第11组 Beta冲刺(3/5)
    第11组 Beta冲刺(2/5)
    第11组 Beta冲刺(1/5)
    第11组 Alpha冲刺(2/6)
    第11组 Alpha冲刺(1/6)
    第11组 团队Git现场编程实战
    团队项目-需求分析报告
  • 原文地址:https://www.cnblogs.com/jiqingwu/p/4043369.html
Copyright © 2011-2022 走看看