[英]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.