&i+1的意义是什么

xjyr 2005-12-21 10:36:31
在《c 陷阱和缺陷》第35页有这样一句话。

int *ip;
int i;

ip=&i;
*ip=17;
如果ip指向一个整数,那么ip+1指向的是计算机内存中下一个整数,在大多数现代计算机中,它都不同于ip所指向内存的下一个内存位置。


本人编了个小程序测试了下:
main()
{
int i=5;
int *ip=&i;

clrscr();
printf("i = %d, &i = %p, ip=%p, ip+1 = %p, &i+1 = %p, *(ip+1) = %d",
i, &i, ip, ip+1, &i+1, *(ip+1));

getch();
}
在Win2000 Tc2.0中其输出结果是:
i = 5, &i = FFD2, ip=FFD2, ip+1 = FFD4, &i+1 = FFD4, *(ip+1) = -32

根据本程序结果来看,很明显: 如果ip指向一个整数,那么ip+1指向的是ip所指向内存的下一个内存位置。 作者是不是把话说反了,还是PC机是特殊情况?
请诸位大虾赐教!!!!!!!!!!

注: 本人系统Win2000 软件Tc2.0
...全文
548 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
tb01412 2005-12-31
  • 打赏
  • 举报
回复
&i+1说的是变量i所在的地址加上1个字节,在GCC编译器中(基于x86),i的地址是4字节对齐的,也就是说&i之后肯定能被4整除的,然后加上1之后就不能被4整除了,在C语言中,有隐式转换与显示转换之分,比如你将&i+1的结果再转换成int *之后,虽然&i+1不能被4整除,转换后就可以被4整除了,也就是说转换后的值不再等于&i+1,这里的所说的转换有可能是显示的,比如:
int *q;
q=(int *)(&i+1);
也有可能是隐示的:
int *q;
q=(&i+1);

但就总体说来,如果指针加1,相当于是指向下一个字节,而q++则代表加了4个字节
ldw198013 2005-12-30
  • 打赏
  • 举报
回复
&i+1=&i+sizoef(i);
晨星 2005-12-29
  • 打赏
  • 举报
回复
发错了,sorry。
csucdl 2005-12-29
  • 打赏
  • 举报
回复
星星点灯
晨星 2005-12-29
  • 打赏
  • 举报
回复
楼上在说啥啊?
bambooeric 2005-12-29
  • 打赏
  • 举报
回复
&i+1是指向下一个整数,不管i的下一个内存单元是什么,它都以一个整数所占内存大小,向后指向。所以可以说是指向下一个整数。
xjyr 2005-12-29
  • 打赏
  • 举报
回复
根据我的程序表明: &i+1是i所占内存的下一个内存单元地址啊 并不是书上说得下一个整数啊
因为i所占内存单元的下一个内存单元存放的不一定就是一个整数
大家可能没理解我得意思
lxb365(不想长大)理解啦
哈哈
dxrenderman 2005-12-21
  • 打赏
  • 举报
回复
&i+1 = &i + sizeof(int *)
lxb365 2005-12-21
  • 打赏
  • 举报
回复
我修改了你的程序
main()
{
int i=5;
int *ip=&i;
char *ptr;
ptr=reinterpret_cast<char*>(ip+1);

clrscr();
printf("i = %d, &i = %p, ip=%p, ip+1 = %p, &i+1 = %p, ptr = %p",
i, &i, ip, ip+1, &i+1, ptr);

getch();
}

在我的机器上(XP+VS2005)上,ip+1,&i+1,ptr的值都是一样的,而ptr是char的指针,也就是说ip+1指向的是一个字符,与你看的书上写的矛盾,由此看来,你那本书似乎是错误的,一个整型指针+1应该就是下一个内存的地址,而不是下一个整数的地址,不过,具体原因还期待高手解答。
goodluckyxl 2005-12-21
  • 打赏
  • 举报
回复
&i+1 = &i + sizeof(i的类型)
x86 2005-12-21
  • 打赏
  • 举报
回复
看代码大概是TC里写的吧,TC里面int是两个字节

我在linux/gcc编译,运行结果是:
i = 5, &i = 0xbfa0f62c, ip=0xbfa0f62c, ip+1 = 0xbfa0f630, &i+1 = 0xbfa0f630, *(ip+1) = -1079970260

&i跟&i+1差4字节
HuangQQ 2005-12-21
  • 打赏
  • 举报
回复
好像+1是具体加多少地址跟变量的类型有关系
signed short int 字长为2
signed long int 字长为4

unsigned short int 字长为2
unsigned long int 字长为4

iamcaicainiao 2005-12-21
  • 打赏
  • 举报
回复
确实是指向下一个整数阿,而不是指向下一个内存位置。ip+1如果只是指向下一个内存位置。就不是FFD4了。指向下一个整数的意思,就是说,指向 1*(1个整数所占用的内存字节空间数)。书上的意思就是说,不是简单的下一个字节。
iamcaicainiao 2005-12-21
  • 打赏
  • 举报
回复
没错阿。搂住想问什么?
piaochen_2002 2005-12-21
  • 打赏
  • 举报
回复
程序是正确的.
晨星 2005-12-21
  • 打赏
  • 举报
回复
什么呀?你的程序是对的:
ip=FFD2, ip+1 = FFD4
这不是显然差2么?
fieldwind 2005-12-21
  • 打赏
  • 举报
回复
没错,楼主自己理解错了。^_^
yclr 2005-12-21
  • 打赏
  • 举报
回复
没有问题,但是不明白你的迷惑之处,这个应该很简单,想明白就好了
xding2005 2005-12-21
  • 打赏
  • 举报
回复
回复:lxb365(不想长大)
ip+1,&i+1,ptr的值的确是一样的,那是因为ptr=reinterpret_cast<char*>(ip+1)中的ip+1值已经计算出来了,只是转成了char型的指针.也就是说ptr+1才是指向下一个内存地址.

69,381

社区成员

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

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