使用指针访问QVector的元素

时间:2012-01-13 11:13:32

标签: c++ qt pointers reference dereference

我的指针和对双打的引用都有问题。

我想按名称访问QVector中的元素。该向量包含双精度:

QVector<double> properties;
properties.append(28.0);
properties.append(1.0);
properties.append(44.0);
properties.append(0.001);

现在我创建指向双打的指针:

double* Amplitude;
double* Frequency;
double* PhaseDifference;
double* Stepsize;

这些指针应提供对载体元素的访问:

Amplitude = &properties[0];
Frequency = &properties[1];
PhaseDifference = &properties[2];
Stepsize = &properties[3];

在我看来,取消引用这些指针应该给我正确的值,但事实并非如此。在这种情况下,我得到前两个指针的零,第三个和第四个是正确的。

我尝试在向量中使用更多条目,结果是只有最后两个条目具有正确的值。那里出了什么问题?

我在构造函数中创建并打印值。打印矢量给出正确的值!

有人有想法吗?

4 个答案:

答案 0 :(得分:4)

您的指定指针实际上是 iterators 。迭代器可以 无效 。例如,无论何时调整向量大小,或向其中插入任何内容,等等。查找特定向量类型的迭代器失效的确切规则,在本例中为QVector,并查看是否已执行任何这些迭代器在打印之前使操作无效。顺便提一下,取消引用无效的迭代器可能会导致未定义的行为。

答案 1 :(得分:3)

你一定做错了。这有效:

#include <QVector>
#include <QDebug>

int main()
{
    QVector<double> v;
    v.append(2.0);
    v.append(18.4);

    double* val1 = &v[0];
    double* val2 = &v[1];

    qDebug() << *val1 << "\n" << *val2 << "\n";
}

出现问题的原因是:

  • 向量被重新分配(调整大小+移动到内存中的另一个位置)
  • 元素将从矢量中删除。
  • 输出不正确,或者您正在打印内存地址而不是值。

答案 2 :(得分:2)

初始化时,应设置向量的大小。一切都会好的,直到你更改它们(推/弹)后,你的指针中的值将是未定义的。

答案 3 :(得分:1)

您的指针可能在获取指针和实际使用它们之间失效。

如果调整QArray的大小(通过添加比当前可容纳的更多元素),就会发生这种情况。