我知道当你将数组作为参数传递时,你基本上会在索引0处传递数组的地址。然后,硬件知道int通常是4个字节,因此它可以轻松访问其他元素。 我的问题是关于矢量。 如果我有一个功能
void bla(std::vector<int> &arr)
{
}
然后它应该传递对向量的引用,但它是否与数组一样? 向量是使用数组实现的,所以我的假设是当我传递一个引用时,它只是传递第一个元素的地址。它是否正确?
另外,如果我作为向量传递,会发生什么?它会在堆栈上创建一个副本吗? 感谢
答案 0 :(得分:5)
std::vector
与原始C风格数组非常不同,因此如果您通过引用传递std::vector
,则无法说出该项中第一项的地址std::vector
是传递给函数的内容。
在std::vector
内部,逻辑不仅仅是“原始C风格数组”。
如果您想要向量中第一项的地址,可以使用&v[0]
或v.data()
获取该地址。
如果按值传递矢量,则会获得原始矢量的副本。您在函数中对该副本所做的所有修改都不反映到原始文件中。
答案 1 :(得分:0)
如果通过引用传递矢量,则传递整个数组并进行编辑。它不传递第一个元素的地址。否则,如果您没有通过引用传递,它只会复制该数组。
资料来源:学校编码经验(如果不准确,请编辑)。
答案 2 :(得分:0)
一般来说:
void foo(Bar b)
- 按值传递,b
是副本或原始Bar
。void foo(Bar& b)
- 通过引用传递,您可以修改原始Bar
到b
。void foo(Bar* b)
- 通过指针传递,您可以修改原始Bar
到b
(只要b
不为空)。void foo(const Bar& b)
- 通过const引用传递,b
是原始Bar
,但您无法在foo
的范围内对其进行修改。void foo(const Bar* b)
- 传递指针指向const,b
是指向原始Bar
的指针,但您无法在foo
的范围内修改它。void foo(Bar* const b)
- 通过const指针传递,b
是指向原始Bar
的指针,原始Bar
可以修改(只要b
}不是null),但你无法改变b
指向的内容。void foo(const Bar* const b)
- 通过const指针指向const,您无法更改原始Bar
,也无法更改b
范围内foo
指向的内容。