我有这段代码 - 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])
。这是为什么?
有人可以详细解释这两个疑问吗?我无法理解在互联网上搜索此问题的搜索字词。这就是我直接在这里问的原因。
答案 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