无法理解语法和优先级
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("%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 )
将产生第一行的第一个元素。
(*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
- 1d 智能指针不适用于语法 (*)++
- 助记符和指向成员语法的指针
- 有人能分解一下这个c++模板的语法吗
- C++避免重复声明的语法是什么
- QMetaObject invokeMethod的基于函数指针的语法
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 按对象的特定方法按升序排列的C++优先级队列
- 使用2个键的cpp-stl::优先级队列排序不正确
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 为什么我需要C++中不同的排序格式来对这个USACO代码上的数组和优先级队列进行排序
- 打印优先级队列
- 单独定义模板化嵌套类方法的正确语法
- 带自定义比较器的最小优先级队列
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- 优先级队列自定义比较器
- 为什么我会收到错误 C2143 语法错误:缺少"*"之前的';'?
- 奇怪的代码抛出编译错误模板< J,int aSize=10> C2143:语法错误:在"<"之前缺少";"
- 无法理解语法和优先级