【问题标题】:Can't understand the syntax & priority无法理解语法和优先级
【发布时间】:2014-11-10 13:26:55
【问题描述】:

我有这个代码 - http://ideone.com/wslBnj

#include <stdio.h>

int main(void) {
    int array[2][3] = {5,10,15,20,25,30};
    int (*ptr)[2][3] = &array; // line 1
    printf("%d\n",***ptr);
    printf("%d\n",*(*ptr)[1]);// line 2
    printf("%d\n",(*ptr)[1][2]);
    return 0;
}

我不理解“第 1 行”的 LHS(左侧)语法。它是什么意思(用文字)?

我不明白“第 2 行”中给出的优先级。我的意思是,输出可能是(*(*ptr))[1] 这个分组,但它是这个*((*ptr)[1])。这是为什么?

有人可以详细解释这两个疑问吗?我无法理解在互联网上搜索此问题的搜索词。这就是我直接在这里问的原因。

【问题讨论】:

  • 可能会有所帮助,至少对于部分疑问:cdecl.org
  • 这一行:int array[2][3] = {5,10,15,20,25,30};写得不好,因为行/列结果是实现定义的。而是使用:int array[2][3] = {{5,10,15},{20,25,30}};

标签: c++ c syntax output


【解决方案1】:

我不理解“第 1 行”的 LHS(左侧)语法。什么 是什么意思(用文字)?

在 C 中,声明跟在使用之后。这意味着 (*ptr)[2][3]int 类型(嗯,从技术上讲,[2][3] 会越界,但你明白了)。无论如何,这意味着(*ptr) 是一个多维整数数组——即一个 2x3 整数数组。因此,ptr 是一个指向整数数组[2][3] 的指针。

我不明白“第 2 行”中给出的优先级。我的意思是,输出 可能是为了 (*(*ptr))[1] 这个分组,但它是为了这个 *((*ptr)[1])。这是为什么呢?

索引的优先级高于取消引用。因此,*(*ptr)[1] 等价于*((*ptr)[1]),在这种情况下它等价于(*ptr)[1][0],因为(*ptr)[1] 是一个由3 个整数组成的数组。

【讨论】:

    【解决方案2】:

    这一行

    int (*ptr)[2][3] = &array; // line 1
    

    声明一个指向int[2][3]类型对象的指针( *ptr ),即它是一个指向int[2][3]类型二维数组的指针

    如果你不使用括号

    int * ptr[2][3];
    

    那么声明将意味着int *类型的二维指针数组

    在第 2 行表达式中

    *(*ptr)[1] 
    

    按以下顺序进行评估。

    1. ( *ptr )
    

    由于 ptr 被声明为指向二维数组的指针,因此取消引用指针将给出指针指向的对象。所以 ( *ptr ) 表示数组

    int array[2][3]
    
    2. ( *ptr )[1]
    

    是对数组第二行的引用

    最后在这个表达式中

    3. *( *ptr )[1]
    

    作为数组“array”第二行的数组 (*ptr)[1] 被转换为指向其第一个元素的指针,并且该指针被取消引用。所以结果*( *ptr )[1]数组“array”第二行的第一个元素你将得到20。

    作为一元运算符的运算符 * 的优先级低于运算符 [] 并且从右到左进行计算。

    来自 C++ 标准

    5.3 一元表达式
    1 一元运算符的表达式从右到左分组。

    因此,如果您要为数组“数组”表达式编写

    **array
    

    然后首先评估子表达式*array 将产生对数组第一行的引用,然后*( *array ) 将产生第一行的第一个元素。

    【讨论】:

      【解决方案3】:

      int (*ptr)[2][3] 也可以表示指向 3d 数组中第一个 [2][3] 矩阵的指针,例如:

          int array[2][2][3] = {{{4,8,12},{8,16,24}},{{5,10,15},{20,25,30}}};
          int (*ptr)[2][3] = array;  // note &array is not used here
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-01
        • 2013-09-16
        • 2013-12-04
        • 2012-06-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多