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