无法理解语法和优先级

Can't understand the syntax & priority

本文关键字:优先级 语法      更新时间:2023-10-16

我有这段代码 - 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("%dn",***ptr);
    printf("%dn",*(*ptr)[1]);// line 2
    printf("%dn",(*ptr)[1][2]);
    return 0;
}

我不明白"第 1 行"的 LHS(左侧(语法。这是什么意思(用文字(?

我不明白"第 2 行"中给出的优先级。我的意思是,输出可能用于(*(*ptr))[1]此分组,但用于此*((*ptr)[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个整数的数组。

此行

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]

数组 ( *ptr ([1] 是数组 "array" 的第二行,被转换为指向其第一个元素的指针,并且此指针被取消引用。因此*( *ptr )[1]数组"array"第二行的第一个元素的结果是,您将获得 20。

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

从C++标准

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

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

**array

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

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