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

How to keep the initial value a pointer was pointing after a variable is changed?

本文关键字:指针 何保持 变量      更新时间:2023-10-16

我意识到这段代码很傻,但它是我问题的简化版本。下面的代码打印出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;
}

对于这个简单的示例,指针甚至都不必要!我们可以简单地进行

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);
}

我很确定你在找这个

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"存储在矢量中之前,我已经取消了对它的引用。我已经调整了打印程序以打印值

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

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);
}