C++ 指针加法

C++ 指针加法,c++,pointers,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的值,而不包含buff

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

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=无符号整数

Command是一个类,其DWORD变量为Command。。像这样的

Class Command {
DWORD command;
}

class
Command
是用户定义的类型,
DWORD
是基本数据类型(
unsigned int
)。既然如此,为什么要这样做-

Command *cr= (Command*)pipebuf;

所以,这是一种方法-

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.

加法将指针向前移动一个,使其指向数组中的第二个DWORD
*(pipebuf+1)
pipebuf[1]
完全等效;代码运行后,
*pipebuf
aka
pipebuf[0]
aka
cr->command
等于2,而
*(pipebuf+1)
aka
aka
pipebuf[1]
等于100

注意,C++中指针类型之间的类型转换通常被认为是坏的风格,在很多情况下都可能有不理想的结果。如果要分配一个

命令数组
,请使用
新命令[…]
;如果您想要DWORD的,那么不要强制转换为
命令*

有时您必须在类型之间转换指针,但通常只有在您确切地知道自己在做什么以及为什么不能避免这样做的情况下才应该这样做


此外,如果您确实需要,您应该使用
静态\u cast
(在这种情况下)或
动态\u cast
(在类型通过继承关联的情况下;这种用法通常更安全)。

我会对此进行评论,但我不能在这些情况下进行代码格式化

我运行了这段代码,输出如预期的“2100”:

#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;
}
#包括
使用名称空间std;
typedef无符号整数双字;
类命令{
公众:
德沃德司令部;
};
int main()
{
DWORD buff3=100;
DWORD*pipebuf=新DWORD[10001];
Command*cr=(Command*)pipebuf;
cr->command=2;
DWORD*房间=(pipebuf+1);
*房间=3间;

std::cout DWORD=unsigned_int.Command是一个DWORD变量为commandYes的类。确切地说,*rooms应该与pipebuf[1]等效,并且应该设置pipe[1]等于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;
}