繁体   English   中英

无法理解语法和优先级

[英]Can't understand the syntax & priority

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

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

我不了解“第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第一行的引用,然后*( *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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM