地址指针,奇怪,并不是我想像的那样,只求一解

jakieliu 2002-01-16 04:24:44
int *p;
int ii[3];
p=ii;
int n,a[3];
int m=sizeof(int);
for (n=0;n<3;n++)
{
*p=n;
p=p+sizeof(int);
}
a[0]=*(p-sizeof(int));
a[1]=*(p-2*sizeof(int));
a[2]=*(p-3*sizeof(int));
p的地址变化为什么是这样的:
p=p+sizeof(int);后,p增加了16,明明sizeof(int)是4!
...全文
97 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
jakieliu 2002-01-16
  • 打赏
  • 举报
回复
关键是当int ii[3]时,一切正常,而且结果也是正却的!
jakieliu 2002-01-16
  • 打赏
  • 举报
回复
int *p;
int ii[4];
p=ii;
int n,a[3];
int m=sizeof(int);
for (n=0;n<3;n++)
{
*p=n;
p=p+sizeof(int);
}
a[0]=*(p-sizeof(int));
a[1]=*(p-2*sizeof(int));
a[2]=*(p-3*sizeof(int));

当我把int ii[3];该为int ii[4];(如上所示)时,确会出问题。具体是:
当第二次执行到*p=n;是,p变为1了,而不是p指向的内存内容变为1。

非常奇怪!望大家帮帮忙测试一下。谢谢!

晨星 2002-01-16
  • 打赏
  • 举报
回复
xiaoxiaohan(萧晓寒)说的对。
HappyBox 2002-01-16
  • 打赏
  • 举报
回复
你是在4字节对齐的编辑器中进行的(比如BCB OR DELPHI),用#pack(1)宏编译则结果就对了
cnss 2002-01-16
  • 打赏
  • 举报
回复
这样就对了

a[1]=*(int*)((int)p-2*sizeof(int));
cBeginner 2002-01-16
  • 打赏
  • 举报
回复
int *p; // p = 4 bytes
xiaoxiaohan 2002-01-16
  • 打赏
  • 举报
回复
p是int型指针,p+1那么p就应当指向下一个int类型,有因为int为32位的,所以p要跳4个字节。
如果p+4当然要跳16个字节。
hz129 2002-01-16
  • 打赏
  • 举报
回复
p指向int类型,而int型在32位程序中占4字节,
p=p+1其实就是让p指向下一个int型数据,它增加的字节数就是sizeof(int),那么p=p+sizeof(int)其实就是加上了sizeof(int)*sizeof(int)了,所以p增加了16
qin_wei 2002-01-16
  • 打赏
  • 举报
回复
p是int型指针,它加1时,实际上跳4字节,
p+4,它的地址就跳16字节。
yczs 2002-01-16
  • 打赏
  • 举报
回复
要连接就说一下
yczs 2002-01-16
  • 打赏
  • 举报
回复
这个和操作系统位数还有编译器相关的

我想我以前在这里说过了

69,372

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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