指针位移?

问题描述:

我有以下代码指针位移?

void PacketEncrypt(Packet* packet, int sizeofpacket) 
{ 
    int* pointer; 
    pointer = ((int*)packet+sizeofpacket)-2; 
    (int)*pointer = packet->PacketSize^0x1A3C; 
    packet->Type += 0x0FFF7; 
} 

问题是当我调试它,编译器将其设置为:

0041585E 8B45 0C   MOV EAX,DWORD PTR SS:[EBP+C] 
00415861 8B4D 08   MOV ECX,DWORD PTR SS:[EBP+8] 
00415864 8D5481 F8  LEA EDX,DWORD PTR DS:[ECX+EAX*4-8] 

但我真正想要的是:

0041585E 8B45 0C   MOV EAX,DWORD PTR SS:[EBP+C] 
00415861 8B4D 08   MOV ECX,DWORD PTR SS:[EBP+8] 
00415864 8D5481 F8  LEA EDX,DWORD PTR DS:[ECX+EAX-2] 

我是那种新到C++,所以你可以帮我解决我做错了什么,或者为什么编译器添加标量* 4?谢谢 !

+0

因为'int'在您的系统上的大小为4个字节。 – Mysticial 2012-07-24 07:04:14

int指针在您的机器上的大小为4 bytes,并且只能移动4*n字节。如果你需要通过2 bytes将它转换为char移动指针,因为sizeof(char) = 1

char *ptr = (char*)otherPtr; 
ptr += 2; //shift by 2 bytes 

int *ptr = (int*)otherPtr; 
ptr += 2; //shift by 8 bytes. (2 * sizeof(int)) 

编辑

(short*)pointer = something. - 你不能分配给rvalue。我想你的意思是:

pointer = (char*) something 

,或者您需要short指针:

short *someOtherPointer = something 
+0

感谢您的例子和答案! – ffenix 2012-07-24 07:09:38

+0

请确保选中其中一个给出的答案,因为它们都是正确的。如果您需要进一步澄清,留下评论也是有用的。 – defube 2012-07-24 07:18:23

+0

我现在遇到以下问题: char * pointer; pointer =((char *)packet + sizeofpacket)-2; (short *)pointer = packet-> PacketSize^0x1A3C; 它说表达式必须是一个可修改的左值。我想要做的: WORD PTR [pointer] = packet-> PacketSize^0x1A3C 谢谢! – ffenix 2012-07-24 07:27:41

下,用指针类型++做指针运算。 ptr+2是2 元素,而不是过去ptr的两个字节。如果,这两个元素是8个字节,并且ptr+2因此将指向通过ptr的8个字节。

+0

感谢您的快速回答! – ffenix 2012-07-24 07:09:11