如何在更改变量后保持指针指向的初始值?

时间:2018-07-31 17:57:04

标签: c++ pointers

我意识到这段代码很愚蠢,但这是我的问题的简化版本。下面的代码打印出10个10,我想做的是打印出数字0到9,这是j添加到向量时j指向的值。如何保持指针存储在向量中,使其指向存储时指向的原始整数值?

int main()
{
    std::vector<int*> test;
    int *j;
    for (int i = 0; i < 10; i++)
    {
        j = &i;
        test.push_back(j);
    }
    for (int i = 0; i < 10; i++)
    {
        std::cout << *test[i] << std::endl;
    }
        return 0;
}

3 个答案:

答案 0 :(得分:1)

对于这个简单的示例,甚至没有必要使用指针!我们可以简单地做

std::vector<int> test;
for (int i = 0; i < 10; i++)
{
    test.push_back(i);
}

但是,如果您坚持使用像您一样的指针...您当前具有未定义行为

循环结束后,i超出范围,并且指针指向不再拥有的内存。您想要的可以通过使用动态分配的内存来完成。我们可以为向量的每个值分配一个新的整数:

std::vector<int*> test;
int *j;
for (int i = 0; i < 10; i++)
{
    j = new int(i);
    test.push_back(j);
}

请记住,完成后必须自己重新分配内存!

for (int i = 0; i < 10; i++)
{
    delete test.at(i);
}

答案 1 :(得分:1)

我很确定您正在寻找这个

int main()
{
    std::vector<int> test;
    int *j;
    for (int i = 0; i < 10; i++)
    {
        j = &i;
        test.push_back(*j);
    }
    for (int i = 0; i < 10; i++)
    {
        std::cout << test[i] << std::endl;
    }
        return 0;
}

所以...。我已将“ test”更改为整数值的向量,而不是指针,并且在将指针“ j”存储到向量中之前已对其取消引用。而且我已经调整了打印例程以打印值

答案 2 :(得分:1)

您可以指向另一个容器的元素:

std::vector<int*> test;  // holding pointers
std::array<int, 10> ray; // holding values
std::iota(ray.begin(), ray.end(), 0) // 0, 1, 2, 3..
for (int i = 0; i < 10; i++)
{
    int *j = &ray[i];
    test.push_back(j);
}