关于指针C ++的误解

时间:2012-07-27 16:14:01

标签: c++ pointers

似乎我对指针有误解,

这是一个例子:(代码可能无法编译,在不同的PC上)

#include <iostream>

struct Debris{
    long big_data;
    //code
};

struct Explosion{
    Debris *db;
    //code
};

void test(){
    Debris *db = new Debris();
    db->big_data = 10000;

    Explosion *e1 = new Explosion();

    e1->db = db;

    std::cout << "db addr:" << db <<"db value:"<< ++db->big_data <<<="" "explosion's="" db="" addr:"="" e1-="">db << "explosion's db value:" << e1->db->big_data << std::endl;

    //why db and e1->db have different addresses?
    //but the e1->db->big_data is changed by ref.
}
你可以解释一下吗?提前谢谢。

2 个答案:

答案 0 :(得分:1)

当我修复cout表达式以便编译时,我看到:

db addr:0x1378010 
db value:10001 
explosion's=0x1378010 
explosion's db value:10000

我假设你问为什么价值看起来不同,你认为在两种情况下都应该是相同的。指针是相同的,正如人们所期望的那样,因为没有任何改变它们。

这是因为您正在修改和使用同一表达式中的值,而无需对这些操作进行排序。这给出了代码未定义的行为;你可以看到旧值,或新值,或完全意外的事情。

如果你要将它分成两个语句,那么第一个语句将在第二个语句之前排序,你会在每种情况下看到相同的值:

std::cout << "db addr:" << db <<" db value:"<< ++db->big_data;
std::cout << " explosion's=" << e1->db << " explosion's db value:" << e1->db->big_data << std::endl;

db addr:0x1720010 
db value:10001 
explosion's=0x1720010 
explosion's db value:10001

答案 1 :(得分:-1)

您增加 db 的事实说明了更改。 ++是运营商中的高优先级。如果您的意图是在使用值之前增加big_data,请添加括号。