【发布时间】:2022-01-16 06:18:41
【问题描述】:
#include<iterator>
#include<iostream>
int a[5][4];
int main()
{
cout << *begin(a);
}
为什么cout 的打印结果与begin(a) 相同?
似乎* 没有取消引用begin(a) 返回的指针?
谁能告诉我为什么?
【问题讨论】:
-
这看起来不像是编译 C++。
#include<iterator>
#include<iostream>
int a[5][4];
int main()
{
cout << *begin(a);
}
为什么cout 的打印结果与begin(a) 相同?
似乎* 没有取消引用begin(a) 返回的指针?
谁能告诉我为什么?
【问题讨论】:
这里* 只影响指针的类型,而不影响它的数值。
std::begin(a) 返回指向a 的第一个元素的指针,类型为int (*)[4](指向4 个整数数组的指针)。
*std::begin(a) 返回int[4]。由于cout 不能直接打印数组,因此数组会衰减到指向其第一个元素的指针,类型为int *,并按原样打印。
**std::begin(a) 将返回 int。
【讨论】:
你有一个二维数组
int a[5][4];
其元素依次为 int[4] 类型的一维数组。
表达式*begin( a ) 产生对int ( & )[4] 类型数组的第一个元素的引用。本语句中使用
cout << *begin(a);
表达式被隐式转换为指向其第一个 int * 类型元素的指针,等效于 &a[0][0]。
另一方面,表达式begin( a ) 的类型为int ( * )[4]。
整个二维数组的地址与其第一个元素的地址一致,一维数组又与一维数组的第一个元素的地址一致。虽然使用的表达式有不同的类型。
【讨论】:
*begin( a ) 是一个表达式,因此不能有int ( & )[4] 类型。它是int[4] 类型的左值。