0

看来我对指针有误解,

这是一个例子:(代码可能无法编译,在不同的 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.
}

你能解释一下吗?提前致谢。

4

2 回答 2

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
于 2012-07-27T16:52:59.873 回答
-1

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

于 2012-07-27T16:19:53.587 回答