在C++版看到一个指针的面试题

sanguomi 2009-05-26 08:47:18
加精

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

大家如果还有更好的解释可以贴出来,呵呵
...全文
1731 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
zlalalal 2009-05-28
  • 打赏
  • 举报
回复
应该先说明 int 是按16位还是32位
某某9 2009-05-27
  • 打赏
  • 举报
回复
mark ! 好帖
tangtao0308 2009-05-27
  • 打赏
  • 举报
回复
mark ! 好帖
supview 2009-05-27
  • 打赏
  • 举报
回复
intel的CPU是输出37363534,这题不错,学习了!
ToBeTough 2009-05-27
  • 打赏
  • 举报
回复
mark
huhaihong 2009-05-26
  • 打赏
  • 举报
回复
LZ已经解释得非常 清楚了
angelalien 2009-05-26
  • 打赏
  • 举报
回复
var
Sz: PChar;
P: PInteger;
begin
Sz := '0123456789';
p := Pinteger(Sz);
Inc(P);
ShowMessage(IntToHex(p^, 8));
end;
starluck 2009-05-26
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 sanguomi 的回复:]
引用 16 楼 starluck 的回复:
引用 13 楼 ttkxyhy 的回复:
我也觉得8楼说的对,++p只是把p所保存的地址的值加1,很明显是0x31啊



If X is a pointer type, it increments X by N times the size of the type pointed to. Thus, given

type
PMyType = ^TMyType;
and

var
P: PMyType;
the statement Inc(P) increments P by SizeOf(TMyType).


德华今天好积极啊,呵呵
[/Quote]

下午就要忙了。
lzxfff 2009-05-26
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 ttkxyhy 的回复:]
我也觉得8楼说的对,++p只是把p所保存的地址的值加1,很明显是0x31啊
[/Quote]

hehe p已经是指向int的指针了 所以地址加4嘛
sanguomi 2009-05-26
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 starluck 的回复:]
引用 13 楼 ttkxyhy 的回复:
我也觉得8楼说的对,++p只是把p所保存的地址的值加1,很明显是0x31啊



If X is a pointer type, it increments X by N times the size of the type pointed to. Thus, given

type
PMyType = ^TMyType;
and

var
P: PMyType;
the statement Inc(P) increments P by SizeOf(TMyType).
[/Quote]

德华今天好积极啊,呵呵
ld10552 2009-05-26
  • 打赏
  • 举报
回复
了解
starluck 2009-05-26
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 ttkxyhy 的回复:]
我也觉得8楼说的对,++p只是把p所保存的地址的值加1,很明显是0x31啊
[/Quote]


If X is a pointer type, it increments X by N times the size of the type pointed to. Thus, given

type
PMyType = ^TMyType;
and

var
P: PMyType;
the statement Inc(P) increments P by SizeOf(TMyType).
  • 打赏
  • 举报
回复
不错,小头机!
chenshanjun2008 2009-05-26
  • 打赏
  • 举报
回复
学习之
toma2008 2009-05-26
  • 打赏
  • 举报
回复
up
dong364 2009-05-26
  • 打赏
  • 举报
回复
没有更好的了, 如果是moto芯片, 那就是34353637了, 这个面试题还是有点意思的
ttkxyhy 2009-05-26
  • 打赏
  • 举报
回复
我也觉得8楼说的对,++p只是把p所保存的地址的值加1,很明显是0x31啊
zhanghua_1228 2009-05-26
  • 打赏
  • 举报
回复
哦,原来是这样,它还会区分类型
sanguomi 2009-05-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zhanghua_1228 的回复:]
我有疑问
@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

为什么是@4 而不是@1
++p只是把p所保存的地址的值加1,为什么会跳到@4,地址加1他应该不会去区分整型而去加4吧
所以应该是 0x31 0x32 0x33 0x34 值我就不算了
[/Quote]

呵呵,你理解错了
chenzhuolin1002 2009-05-26
  • 打赏
  • 举报
回复
这题有意思
加载更多回复(21)

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧