根据我的理解,向量分配内存来存储堆上的元素。由于向量将元素存储在数组中,因此当我将向量作为值传递时,不应仅复制数组的内部指针。 请考虑以下代码:
#include <iostream>
#include <vector>
void Foo(std::vector<int> input)
{
for (int i = 0; i < input.size(); ++i)
{
std::cout << &input[i] << std::endl; //Print address of each element
}
}
int main()
{
std::vector<int> test{ 1,2,3,4,5,6 }; //Create Vector
for (int i = 0; i < test.size(); ++i)
{
std::cout << &test[i] << std::endl; //Print address of each element
}
std::cout << "----------------" << std::endl;
Foo(test); //Pass by Value
std::cin.get();
}
作为输出我得到
01445358
0144535C
01445360
01445364
01445368
0144536C
----------------
0144F110
0144F114
0144F118
0144F11C
0144F120
0144F124
我理解向量对象是复制的,因此具有不同的地址但由于元素存储在堆上并且由指向包含元素的数组的int *访问,因此元素是否应该具有相同的地址?
请考虑以下方案,该方案按预期工作:
struct Array
{
int* elements; //pointer to array
Array(int* e) : elements{ e } { }
};
void Test(Array input)
{
for (int i = 0; i < 5; ++i)
{
std::cout << &input.elements[i] << std::endl; //print address of array
}
}
int main()
{
int* arr = new int[5]; //array on heap
Array t(arr);
for (int i = 0; i < 5; ++i)
{
std::cout << &t.elements[i] << std::endl; //print address of array
}
std::cout << "-------------" << std::endl;
Test(t); //pass by value
std::cin.get();
}
输出:
011A4728
011A472C
011A4730
011A4734
011A4738
-------------
011A4728
011A472C
011A4730
011A4734
011A4738
为什么打印相同的地址而第一个不打印?