指针的 ++ 和 +1 永远一样么???

stanely 2002-11-21 01:02:43
看下列程序:
main()
{
int a[5]={10,20,30,40,50};
int *p=a;
printf("sizeof(int*)=%d\n",sizeof(int*));//输出sizeof(int*)=2;
printf("sizeof(int)=%d\n",sizeof(int));//输出sizeof(int)=2;
printf("a[0]=%d,p=%d\n",p*,p);//输出a[0]=10,p=0
p++;
printf("a[1]=%d,p=%d\n\n",p*,p);//输出a[1]=20,p=0
}
///////////////

1.要是把p++换成p=p+1后面的输出结果为什么一样??

我记得指针+1就是把指针当作一个一般的数来+1的,而++是“智能”的加上sizeof(p),难道是我记错了?
至少pascal里面不是这样。


2.为什么两次输出的p都是0???
...全文
318 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
IEQQ 2002-11-23
  • 打赏
  • 举报
回复
: zxm954712(zhangxiaoming) 兄弟说的很对,在下领教了。
fallhunter 2002-11-21
  • 打赏
  • 举报
回复
gg
xiaojunsyiae 2002-11-21
  • 打赏
  • 举报
回复
程序编码有点问题,vc6,win2k编译没有问题!
同意楼上。
fengljy 2002-11-21
  • 打赏
  • 举报
回复
你编译器从那里弄来的,有问题吧? 我在计算机上对你的代码进行的编译后,输出如下:

sizeof<int*> = 4
sizeof<int> = 4
a[0] = 10, p = 1245036
a[1] = 20, p = 1234040

编译环境: VC6.0; windows2000
alfxiao 2002-11-21
  • 打赏
  • 举报
回复
我在vc6下编译运行p的输出不为0
stanely 2002-11-21
  • 打赏
  • 举报
回复
笔误:P*应该是*p,


但是我还是不明白为什么p的输出永远是0?

难道这个指针指向的地址是null,不是a[0]和a[1]?
Bandry 2002-11-21
  • 打赏
  • 举报
回复
不错,p++与p=p+1结果都一样,指针的加1不是普通数据的加1,它会进行sizeof运算的。还有一个问题就是 :++本来就是自加1的简写,C++任何时候、任何地方xx++和xx=xx+1都是一样的,不管xx是什么东西。你不要把概念搞错了。我想你要问的应该是指针加1问题,而不是p++与p=p+1是不是一样的问题。
NetBird_China 2002-11-21
  • 打赏
  • 举报
回复
为什么要考虑Pascal呢?
p++ 与 p+1 在C++中是一样的
zhengguoshan 2002-11-21
  • 打赏
  • 举报
回复
printf("a[1]=%d,p=%d\n\n",p*,p);//输出a[1]=20,p=0
应该是,printf("a[1]=%d,p=%d\n\n",*p,p);//输出a[1]=20,
*P是指针指向的数组中的元素...
P 中只是一个数组地址..

zxm954712 2002-11-21
  • 打赏
  • 举报
回复
不同的编译器得到的sizeof(int)大小有所不同,关键是看编译器给一个int型分配多少内存空间。在tc中,int:2个字节,在VC中,int:4个字节,所以
在tc中:
sizeof(int)=2;
sizeof(int*)=2;
在vc中:
sizeof(int)=4;
sizeof(int*)=4;
jian 2002-11-21
  • 打赏
  • 举报
回复
上面的x要改为p
jian 2002-11-21
  • 打赏
  • 举报
回复
首先要明确,在不同编译器下sizeof(T)的大小可能会有所不同
在标准的C++中,类型T的指针p 加上1(即p+1)表示:在p指向的地址的基础上再偏移sizeof(T)个字节

++p就是p=(p+1)
p++就是p=(t=p,p=p+1,t),注意,逗号表达式取其中最后的一个表达式的值,t是一个和x相同的临时变量

显然,p++单独使用和p=p+1是没什么差别的,只是实现的原理上不同而已
stanely 2002-11-21
  • 打赏
  • 举报
回复
难道是 tc的bug?
stanely 2002-11-21
  • 打赏
  • 举报
回复
我用的tc2.0+win2000
sukersoft 2002-11-21
  • 打赏
  • 举报
回复


不完全一样。
x2jack 2002-11-21
  • 打赏
  • 举报
回复
在c/c++中++/+1一样,"+1*sizeof(type)"的这个工作是由编译器完成的。
IEQQ 2002-11-21
  • 打赏
  • 举报
回复
我给你重新加了批注,请看一下.
main()
{
int a[5]={10,20,30,40,50};
int *p=a;
printf("sizeof(int*)=%d\n",sizeof(int*));//输出sizeof(int*)=2;
/*指针在c语言里面也是一个变量, 有float * ,int*, char*,但
*决不是因为他们是不同类型的指针,他们所占的类存大小就有区别
*在c语言里面有近指针near和远指针区别far,上面的是近指针,占
*两个字节,指针的本质事实上是一个表示地址的数值.无论你在那个
*类存单元里面存入什么类型的数,他的地址的代码总是一个占
*两个字节的二进制数.你可以试一试, sizeof(float *)也是2
*/

printf("sizeof(int)=%d\n",sizeof(int));//输出sizeof(int)=2;
printf("a[0]=%d,p=%d\n",*p,p);//输出a[0]=10,p=0
p++;
printf("a[1]=%d,p=%d\n\n",*p,p);//输出a[1]=20,p=0
}
///////////////
我把你上面的程序运行了一遍,结果如下:

a[0]=10
p=0x8fadffec
a[1]=20
p=0x8fadffee



nijing 2002-11-21
  • 打赏
  • 举报
回复
试了,没问题。
北极猩猩 2002-11-21
  • 打赏
  • 举报
回复
指针+1和++运算是一样的。不过++的效率更高一些。
mountlin 2002-11-21
  • 打赏
  • 举报
回复
printf("a[0]=%d,p=%d\n",p*,p);//输出a[0]=10,p=0
p*是什么意思?*p?

69,368

社区成员

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

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