main()
{
char *sz = "0123456789";
int *p = (int*)sz;
printf("%x\n",*++p);
} 字符’0‘对应的十六进制是0x30
下边是我用DELPHI写的
var
Sz: PChar;
P: PInteger;
begin
Sz := '0123456789';
p := Pinteger(Sz);
Inc(P);
ShowMessage(IntToHex(p^, 8));
end;
下边是别人解释
主要考察的目的是大端和小端的问题。
对于intel架构的cpu,如果出现跨多个自己的数据类型,如int,long等,低地址存储数据的地位,高地址存储数据的高位。
现在我假定:
地址从@0开始,那么sz在内存的存储为
@0 @1 @2 @3 @4 @5 @6 @7 @8 @9
0x30 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 0x39
当你把char*强制类型转化成int*后,因为int占四个字节,那么p指向@0,并且*p占有的地址是@0@1@2@3,打印的时候
先进行++p操作,那么p指向@4,此时*p占有的地址是@4@5@6@7,根据上面地地址存地位,高地址存高位的解释,那么
*p应该等于0x37363534
大家如果还有更好的解释可以贴出来,呵呵