小问题

canshui 2010-05-14 10:51:08
#include <stdio.h>
#include <malloc.h>
void main()
{
int a[4]={1,2,3,4};
int *p;
printf("%d\t%d\n",a[0],a[3]);
p=a;
p=p+3; //here
printf("%d\t%d\n",*p,*(p+3));
}
运行结果:1 4
4 1

嗯,这里"p=p+3;"貌似实现了交换的效果

为什么呀???
...全文
81 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
canshui 2010-05-14
  • 打赏
  • 举报
回复
嗯,晕,昏头了……
谢谢……

brookmill 2010-05-14
  • 打赏
  • 举报
回复
楼主如果有兴趣想深究,可以把a和p的地址打出来看看
printf("%p, %p\n", a, &p);
我这里输出的是 0012FF5C, 0012FF6C
所以a[6]指向0012FF74,刚好是p本身的一个字节。
  • 打赏
  • 举报
回复
完全是巧合,

楼主可以多运行几次,便可知道结果不定!因为访问越界了!
king__xy 2010-05-14
  • 打赏
  • 举报
回复
应该纯属巧合,程序中p = p + 3,然后在输出时又有p + 3,已经超出了数组的范围了,
z569362161 2010-05-14
  • 打赏
  • 举报
回复
运行结果:1 4
4 1
我不知道是为什么?
只好自己运行了一下,是一个292354521
z569362161 2010-05-14
  • 打赏
  • 举报
回复
#include <stdio.h>

int main()
{
int a[4]={1,2,3,4},*p=a;
printf("%d\t%d\n",a[0],a[3]);
p=p+3;//p指向a[3]的地址
printf("%d\t%d\n",*p,*(p+3));//,*(p+3)里的值是随机值。
}
zhangweiit 2010-05-14
  • 打赏
  • 举报
回复
楼主,我就是不信你的代码会输出第二个4,1,除非巧合
我运行了一下,证明你的确实是巧合

p = p + 3,只是把p指针往前移三个单位而已,与交换无关
yxriyin 2010-05-14
  • 打赏
  • 举报
回复
个人表示*p输出结果为4好理解
但*(p+3)竟然是1
不会只是巧合吧
brookmill 2010-05-14
  • 打赏
  • 举报
回复
p=p+3不是交换,是把p指向了a[3]的位置,所以
printf("%d\t%d\n",*p,*(p+3)); 输出的是a[3]和a[6]的值
但是a[6]的位置是一个不确定值。楼主输出1说明RP不错,我这里输出的是1455339532

69,370

社区成员

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

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