鱼C论坛

 找回密码
 立即注册
查看: 2926|回复: 4

一个指针的题目。谁能解释下。

[复制链接]
发表于 2012-3-30 22:49:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
int main(void)
{
int a[4] = {1, 2, 3, 4};
int *ptr1=(int *)(&a+1);
int *ptr2=(int *)((int)a+1);
printf("%x, %x\n", ptr1[-1], *ptr2);
return 0;
}
结果
4,2000000.
为什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-3-31 12:34:08 | 显示全部楼层
本帖最后由 离尘※影 于 2012-3-31 19:43 编辑

数组a是在栈中依次排列的,那么a=&a(如果数据在堆中那么a记录的是数据在堆中的地址,而a本身的地址则在栈中),&a+1,a的地址加上a数组的长度,指向数组结尾;(int)a+1,是将一个地址转换为一个整数然后加1,结果就完全不一样了。
a在内存中的数据为:01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00
a,指向01开始的位置
&a+1,指向数组末尾
(int)a+1,指向01后面的一个位置00,它所指向的整数为:00 00 00 02,这4个内存单元以16进制显示出来就是2000000,也就是*ptr2的值
至于ptr1它输出时引用04 00 00 00,所以结果为4

很久没有弄过C了,基本上都忘了,关于&a+1上午回答的是错的,刚调试了下,楼下的回答是正确的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-3-31 13:03:06 | 显示全部楼层
#include <stdio.h>
int main(void)
{
        int a[4] = {1, 2, 3, 4};
        int *ptr1=(int *)(&a+1);   // (&a+1)指将a的地址加上a数组长所得结果赋值给指针ptr1
        int *ptr2=(int *)((int)a+1); //((int)a+1)指将a代表的常量加1所得结果赋值给指针ptr2
        printf("%x, %x\n", ptr1[-1], *ptr2);
        return 0;
}
360截图20120331124606218_副本.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-3-31 14:31:06 | 显示全部楼层
楼上的讲解都很清楚了..
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-3-31 20:53:06 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 15:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表