我不明白为什么这段代码如此工作。我知道ptr是指向int数组的指针,它指向arr的第二个“行”。
int arr[][2] = { {1}, 2, 3};
int (*ptr)[2] = arr + 1;
cout << (**arr)[*ptr];
它打印3,arr[1][1]
但它**arr
是1,并且*ptr
是的存储地址arr[1][0]
。
为什么(**arr)[*ptr]
返回3?我在这里想念什么吗?
这个宣言
int arr[][2] = { {1}, 2, 3};
声明类型为两个元素的数组int[2]
。
这个表达
(**arr)
给出整数值1。
这个宣言
int (*ptr)[2] = arr + 1;
声明指向数组arr的第二个元素的指针。因此,* ptr返回数组arr的第二个“行”。在这样的表达式中使用
(**arr)[*ptr]
它被转换为指向其第一个元素的指针。
所以你有一个像
int[int *]
要么
i[p]
其中,i是整数值,p是指针。
那相当于
int *[int]
要么
p[i]
因为根据C ++标准(或C标准),两者的评估都像
*( p + i )
因此,当** arr等于1并且表达式* ptr指向第二行的第一个元素时,结果是第二行的第二个元素为3。
根据C ++ 17标准(5.2.1下标)
1后缀表达式,后跟方括号的表达式是后缀表达式。其中一个表达式的类型应为“ T的数组”或“ T的指针”,另一个表达式应为无范围的枚举或整数类型。结果为“ T”类型。类型“ T”应为完全定义的对象类型。64表达式E1 [E2](根据定义)与*((E1)+(E2))相同[注意:有关*和*的详细信息,请参见5.3和5.7。 +和8.3.4了解数组的详细信息。—尾注],但对于数组操作数而言,如果该操作数为左值则结果为左值,否则为x值。
那就是如果你有一个像这样的数组
T a[N];
T
表达式时哪里有类型说明符
a[i]
相当于
i[a]
提供的i
表示后缀表达式。
这是一个演示程序。
#include <iostream>
int main()
{
int a[] = { 1, 2, 3, 4, 5 };
const size_t N = sizeof( a ) / sizeof( *a );
size_t i = 0;
while ( i != N ) std::cout << i++[a] << ' ';
std::cout << '\n';
return 0;
}
它的输出是
1 2 3 4 5
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句