指针添加

时间:2011-03-19 09:01:16

标签: c++ pointers

我不明白为什么指针添加失败。

DWORD *pipebuf=new DWORD[10001];

Command *cr= (Command*)pipebuf;
cr->command=2;
DWORD* rooms=(pipebuf+1); //should work fine..sets the room pointer equal to pipe[2]
*rooms=buff3;  //where buff3=100

然而,pipebuf的值只包含command的值,它不包含buff3的值。然而,当我删除新关键字时,它工作得很好......为什么?

DWORD = unsigned_int

Command是一个带有DWORD变量命令的类......类似这样的

Class Command {
DWORD command;
}

3 个答案:

答案 0 :(得分:2)

添加将指针向前移动一个,使其指向数组中的第二个DWORD。 *(pipebuf+1)恰好等同于pipebuf[1];代码运行后,*pipebuf又名pipebuf[0]又名cr->command等于2,而*(pipebuf+1)又名*rooms又名pipebuf[1]等于100。

但请注意,C ++中指针类型之间的类型转换通常被认为是错误的样式,并且在许多情况下可能会产生不良结果。如果要分配Command的数组,请使用new Command[...];如果你想要DWORD,那就不要投入Command*

有时你必须在类型之间投射指针,但通常只有在你知道完全你在做什么以及为什么你不能避免这样做时才应该这样做。

此外,如果您确实需要,您应该使用static_cast(在这种情况下)或dynamic_cast(如果类型通过继承相关;这种用法通常更安全)。

答案 1 :(得分:0)

class Command是用户定义的类型,DWORD是原始数据类型(unsigned int)。在那种情况下,为什么这样做 -

Command *cr= (Command*)pipebuf;

class Command {
    public :     // Added public keyword
    DWORD command;  // DWORD is a typedef for unsigned int as you mentioned.
};  // class definition should end with a semi-colon

所以,这是可行的方法 -

Command *cr = new Command[10001] ;
DWORD *pipebuf=new DWORD[10001];

// After assigining values to DWORD pointed locations. Then you can do this -

cr->command = pipebuf[0] ; // this sets the value of cr[0].command.

答案 2 :(得分:0)

我会将此作为评论,但我无法在这些内容中进行代码格式化。

我运行了此代码,输出为“2 100”,如预期的那样:

#include <iostream>

using namespace std;

typedef unsigned int DWORD;
class Command {
  public:
    DWORD command;
};

int main()
{
    DWORD buff3 = 100;
    DWORD *pipebuf = new DWORD[10001];
    Command *cr = (Command*)pipebuf;
    cr->command = 2;
    DWORD *rooms = (pipebuf+1);
    *rooms = buff3;

    std::cout << pipebuf[0] << " " << pipebuf[1] << endl;
}

AFAICT是您将问题扩展为完整程序的最简单方法。

您是否可以尝试使用此功能并从原始代码中添加更多内容,直到出现问题为止?