无法理解语法&优先

时间:2014-11-10 13:26:56

标签: c++ c syntax output

我有这段代码 - 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])。这是为什么?

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

3 个答案:

答案 0 :(得分:3)

  

我不理解第1行和第39行的LHS(左侧)语法。什么   这是什么意思(用文字表示)?

在C中,声明遵循使用..这意味着(*ptr)[2][3]的类型为int(从技术上讲,[2] [3]将超出范围,但你明白了) 。无论如何,这意味着(*ptr)是一个多维的整数数组 - 即一个2x3的整数数组。因此,ptr是指向数组[2] [3]的指针。

  

我不理解第2行&#39;中给出的优先级。我的意思是,输出   可能是(*(* ptr))[1]这个分组,但它是为了这个   *((* PTR)[1])。那是为什么?

索引的优先级高于解除引用。因此,*(*ptr)[1]相当于*((*ptr)[1]),在这种情况下它等同于(*ptr)[1][0],因为(*ptr)[1]是一个包含3个整数的数组。

答案 1 :(得分:3)

这一行

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

向int [2]类型的对象声明一个指针( *ptr ) [3]这是一个指向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]

数组(* ptr)[1],它是数组的第二行&#34;数组&#34;转换为指向其第一个元素的指针,并取消引用此指针。所以结果*( *ptr )[1]是第二行数组&#34;数组&#34;的第一个元素。那就是你会得到20。

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

来自C ++标准

  

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

因此,如果您要为您的数组编写&#34;数组&#34;表达

**array

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

答案 2 :(得分:1)

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