[英]cast an C++ array to a vector
这是我在Leetcode上找到的代码。 但是我无法理解以下两行,尤其是*(&a + 1)
。 结果显示了数组a
的副本。 任何人都可以给出一些解释吗? 谢谢!
int a[5] = {0, 1, 2, 3, 4};
vector<int> v4(a, *(&a + 1));
从数组构造向量时通常遇到的示例通常如下所示:
int a[5] = {...};
vector<int> v4(a, a + 5 );
// or vector<int>(a, a+sizeof(a)/int); // automatically calculate num elems inside a
上面的例子只是表明你想用数组“a”中的所有元素构造一个向量。 此示例中的“a”只是数组起始元素的地址,然后添加5以获取最后一个元素的地址。 更直观的方式是:
vector<int> v4(begin(a), end(a));
除非你当然不想要v4中的所有元素
现在您给出的示例是第一个示例的简写,您不需要显式声明数组的大小。 我假设你只是与向量构造函数的第二个参数混淆。 第二个参数只返回数组“a”的最后一个元素的地址。 但是怎么样?
好吧,让我们分解它:&a将地址返回到“a []”。 本质上是指向数组“a”的指针。 现在,如果你向这个地址添加一个,你将得到一个指向地址“a [0]”+ sizeof a []的指针,它将指向地址a的最后一个元素。 将此与上面的第一个示例进行比较。 你必须加5,为什么这不是这里的情况? 那么你正在与不同的单位合作。 &a指向[]的起始地址,而不是数组的第一个元素的地址。 所以你基本上以[5]为单位而不是int单位移动地址。
然后最后你有取消引用运算符“*”取消引用指针并获取最后一个元素的array []的地址。
a是类型a []和&a是类型* a []因此需要取消引用以使其成为相同类型,否则会出现编译器错误。
TLDR:您使用不同的方法获取最后一个元素的地址。 +1运算符的行为与您正在处理的类型相关。 a + 1与起始地址“a”+ sizeof 1整数相同。 &a + 1与[]的[] +大小的起始地址相同。
您对阵列衰减感到困惑。 a
是“作为一个整体”的数组。 它衰减成一个指向MOST上下文中第一个元素的指针,但是unary-&的操作数是它没有的少数操作数之一。 所以&a
给出了整个数组的地址,而不是第一个元素的地址。 这些是相同的地方,但有不同的类型( int (*)[5]
vs int *
),不同的类型意味着指针算法不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.