// ¿Pasar un std::vector crea otro bloque? Se comprueba comparando direcciones.
#include <iostream>
#include <vector>

void by_value(std::vector<int> values, const int *original) {
    values[0] = 99;
    std::cout << "por valor:      mismo bloque = " << (values.data() == original)
              << ", values[0] = " << values[0] << "\n";
}

void by_const_reference(const std::vector<int>& values, const int *original) {
    std::cout << "por const&:     mismo bloque = " << (values.data() == original)
              << ", values[0] = " << values[0] << "\n";
}

void by_reference(std::vector<int>& values, const int *original) {
    values[0] = 99;
    std::cout << "por referencia: mismo bloque = " << (values.data() == original)
              << ", values[0] = " << values[0] << "\n";
}

int main() {
    std::vector<int> numbers = {1, 2, 3};
    const int *block = numbers.data();

    by_value(numbers, block);
    std::cout << "en main:        numbers[0] = " << numbers[0] << "\n";

    by_const_reference(numbers, block);
    std::cout << "en main:        numbers[0] = " << numbers[0] << "\n";

    by_reference(numbers, block);
    std::cout << "en main:        numbers[0] = " << numbers[0] << "\n";
    return 0;
}
