zoukankan      html  css  js  c++  java
  • 复杂声明的正确解读(*、()、[])

    摘自《C Primer Plus第六版中文版》page484

    声明时可使用的符号
    符号 含义
    * 表示一个指针
    () 表示一个函数
    [] 表示一个数组

    下面时一些较复杂的声明示例:

    int board[8][8];  //声明一个内含int数组的数组

    int **ptr;    //声明一个指向指针的指针,被指向的指针指向int

    int * risks[10];   //声明一个内含10个元素的数组,每个元素都是一个指向int的指针

    int (* risks)[10];   //声明一个指向数组的指针,该数组内含10个int类型的值

    int * oof[3][4];   //声明一个3x4的二维数组,每个元素都是指向int的指针

    int (* uuf)[3][4];   //声明一个指向3x4二维数组的指针,该数组中内含int类型值

    int (* uof[3])[4];   //声明一个内含3个指针元素的数组,其中每个指针都指向一个内含4个int类型元素的数组

    要看懂以上声明,关键要理解*、()和[]的优先级。记住下面几条规则。

    1. 数组名后面的[]和函数名后面的()具有相同的优先级。它们比*(解引用运算符)的优先级高。因此下面声明的risk是一个指针数组,不是指向数组的指针:int *risks[10];
    2. []和()的优先级相同,由于都是从左往右结合,所以下面的声明中,在应用方括号之前,*先与rusks结合。因此rusks是一个指向数组的指针,该数组内含10个int类型的元素:int (* rusks)[10];
    3. []和()都是从左往右结合。因此下面声明的goods是一个由12个内含50个int类型值的数组组成的二维数组,而不是一个有50个内含12个int类型值的数组组成的二维数组:int goods[12][50];

    根据这些规则,还可以声明:

    char * fump(int);  //返回字符指针的函数

    char (* frump)(int);  //指向函数的指针,该函数的返回类型为char

    char (* flump[3])(int)  //内含3个指针的数组,每个指针都指向返回类型为char的函数

    这三个函数都接受int类型的参数。

    可以使用typedef建立一系列相关类型:

    typedef int arr5[5];

    typrdef arr5 * p_arr5;

    typedef p_arr5 arrp10[10];

    arr5 togs;  //togs是一个内含5个int类型值的数组;

    p_arr5 p2;  //p2是一个指向数组的指针,该数组内含5个int类型的值

    arrp10 ap;  //ap是一个内含十个指针的数组,每个指针都指向一个内含5个int类型值的数组

  • 相关阅读:
    linux 备份当前文件
    zz Apache 2.2.15 + PHP 5.3.2+ mysql windows环境配置
    zz iframe父子窗口间js方法调用
    批处理命令里获取本机的机器名
    Cache Concurrency Problem False Sharing
    因为添加assembly到GAC引起的Windows Azure Web Role部署失败
    求数组中满足a[i]<a[j]的相距最远的元素
    Dispose模式
    比较汇编指令 LEA 和 MOV
    读写Unicode字符串(UTF8,UTF16…)
  • 原文地址:https://www.cnblogs.com/taouu/p/14616543.html
Copyright © 2011-2022 走看看