如何解释输出的值

chen3bing 2011-08-16 03:47:38
我照着书上写了一个小程序。
#include<stdio.h>

int main(int argc,char *argv[])
{

int a[5]={1,2,3,4,5};
int *ptr1=(int *)(&a+1);
int *ptr2=(int *)((int)a+1);
printf("%x,%x",ptr1[-1],*ptr2);
getchar();
}
结果输出:5,2000000
我不理解,高手解惑。
...全文
71 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2011-08-16
  • 打赏
  • 举报
回复
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!
xue4321 2011-08-16
  • 打赏
  • 举报
回复
指针和地址混合运算,,%x是格式字符串,十六进制输出。结果也可能产生随机数。
wanglllmn 2011-08-16
  • 打赏
  • 举报
回复
2楼感觉上比较正解!
lc_windson 2011-08-16
  • 打赏
  • 举报
回复
学习了
至善者善之敌 2011-08-16
  • 打赏
  • 举报
回复

整理一下
int main(int argc,char *argv[])
{

int a[5]={1,2,3,4,5};
int *ptr1=(int *)(&a+1);//这里直接把指针移动到a[5]的地址的NEXT地址上
int *ptr2=(int *)((int)a+1);//这里仅仅是把a[5]的首地址+1
printf("%x,%x",ptr1[-1],*ptr2);//所以ptr1[-1]相当于把地址又移动回了最后一个数组上,及a[4]=5
getchar();
//而ptr2的内容就比较戏剧性了
//看一下内存格式 :
//ptr2这时的指针指向了这里 ↓
//|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|1|
//↑高 ↑低
//所以读出的数据就是整形四个字节就是02000000,也就是2000000
}
lc_windson 2011-08-16
  • 打赏
  • 举报
回复
表示不理解LZ程序到底想干嘛
DIE654456 2011-08-16
  • 打赏
  • 举报
回复
int a[5]={1,2,3,4,5};

int *ptr1=(int *)(&a+1);
// &a +1 ,
// &a得到的地址是一个数组的地址,即数组的指针,
// +1的意思是到下一个数组,而不是下一个元素
// &a+1到下一个数组了,因此ptr1[-1]是5

printf("%x",ptr1[-1]);
至善者善之敌 2011-08-16
  • 打赏
  • 举报
回复

int main(int argc,char *argv[])
{

int a[5]={1,2,3,4,5};

// cout<<a<<endl;
cout<<&a<<endl;
cout<<&a+1<<endl;
int *ptr1=(int *)(&a+1);//这里直接把指针移动到a[5]的地址的NEXT地址上
int *ptr2=(int *)((int)a+1);//这里仅仅是把a[5]的首地址+1
printf("%x,%x",ptr1[-1],*ptr2);//所以ptr1[-1]相当于把地址又移动回了最后一个数组上,及a[4]=5
getchar();
//而ptr2的内容就比较戏剧性了
//看一下内存格式 :
//ptr2这时的指针指向了这里 ↓
//|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0||1|

//所以读出的数据就是整形四个字节就是02000000,也就是2000000
}
chen3bing 2011-08-16
  • 打赏
  • 举报
回复
高手支招!

70,023

社区成员

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

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