Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用指针访问QVector的元素_C++_Qt_Pointers_Reference_Dereference - Fatal编程技术网

C++ 使用指针访问QVector的元素

C++ 使用指针访问QVector的元素,c++,qt,pointers,reference,dereference,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); 这些指针应提供对向量元素的访问: Amplitude = &properties[0]; Frequency = &p

我在指向双精度的指针和引用方面有困难

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

QVector<double> properties;
properties.append(28.0);
properties.append(1.0);
properties.append(44.0);
properties.append(0.001);
这些指针应提供对向量元素的访问:

Amplitude = &properties[0];
Frequency = &properties[1];
PhaseDifference = &properties[2];
Stepsize = &properties[3];
在我看来,取消引用这些指针应该会给我正确的值,但事实并非如此。在这个例子中,我得到了前两个指针的零,第三个和第四个指针是正确的

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

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


有人有想法吗?

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

您一定做错了什么。这项工作:

#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";
}
#包括
#包括
int main()
{
qv矢量;
v、 追加(2.0);
v、 追加(18.4);
double*val1=&v[0];
双*val2=&v[1];

qDebug()在您获取指针和实际使用指针之间,指针可能已失效


如果调整了
QArray
的大小(通过添加超出当前容纳范围的元素),则可能会发生这种情况。

初始化向量时,应设置向量的大小。在更改它们之前,一切都将正常(推送/弹出)之后,指针中的值将被取消定义。

您是否修改了向量?这可能会使所有指针无效。旁白:如果您有少量(四)个命名属性,则根本不应该使用
QVector
。是的……我这样做了:(你的意思是调整大小可以移动向量吗???这很有意义,因为它需要相邻的内存单元…谢谢你的想法…我将更改代码的顺序并检查结果:是的…这就是问题所在!!我的代码顺序错误。向量的调整使引用无效。非常感谢;)更正确的说法是,向量迭代器只是指针。更准确地说,你不能从指针构造迭代器,但相反是可能的。@rubenvb:不,这并不更正确。指针是向量迭代器,即它们满足迭代器概念的要求。但其他东西也可以用作迭代器。例如,在MSVC调试模式下,向量迭代器是一个检查boundaries@user1147533当前位置不客气。如果我的回答解决了你的问题,你应该这样做。
#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";
}