C ++向量项被复制,不通过引用传递

时间:2017-08-03 00:04:11

标签: c++ vector stack heap

根据我的理解,向量分配内存来存储堆上的元素。由于向量将元素存储在数组中,因此当我将向量作为值传递时,不应仅复制数组的内部指针。 请考虑以下代码:

#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

为什么打印相同的地址而第一个不打印?

0 个答案:

没有答案