求高手解释一个c语言题

[复制链接]
查看11 | 回复1 | 2011-3-19 12:58:51 | 显示全部楼层 |阅读模式
#include stdio.h
int main()
{
int a[5]={1,2,3,4,5};
int *ptr1=(int *)(
int *ptr2=(int *)((int)a 1);
printf(\"%x,%x\\n\",ptr1[-1],*ptr2);
return 0;
}
x86上结果是 5,2000000
调试defds123a 1与defds123a数值上相差13
ptr1与ptr2两个指针有什么区别?
a不是数组的首指针吗,那defds123a又是什么意思?
回复

使用道具 举报

千问 | 2011-3-19 12:58:51 | 显示全部楼层
<pre id=\"best-answer-content\" class=\"reply-text mb10\">1. a本身是个指针,defds123a是一个指向指针的指针。你可以把a这个数组看成一个二维数组的第一行,defds123a 1相当于将指针指向了二维数组的第二行。输出ptr1[-1],相当于将指针倒退一个元素的距离正好输出的是a的最后一个元素5.

2. a这个数组的数据在内存中的存储形式如下:
01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05
可见是采用小端模式(数字的低位放在低地址中)存储在内存中的。如果使用(int)a 1话是指将指针强制转化正整形并加一得到一个新的地址,相当于将指针向后移动一个字节那么(int)a 1指向的内存地址就变成了:00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05,所以说把它指向的数输出地话相当于输出00 00 00 02这一部分,即输出0x02000000。所以按照%x格式输出之后就是你看到的那个样子了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行