//分析下面这段代码的输出,考到了指针,大小端,字长。
#include
#include
int main()
{
int a[5]={7,8,9,10,11};
int *ptr1=(int *)(&a+1);
int *ptr2=(int *)((int )a+1);
printf("%x,%x",ptr1[-1],*ptr2);
return 0;
}
/* 分析:
对 &a+1 的分析:
一维数组名是指向列的,在列指针前面加上一个&就变成行指针,行指针加1自然就指向了数字11的下一个数据的地址,因此ptr1[-1]就指向了11,故输出为b
对 ((int )a+1) 的分析:
说明:在这里一个int型的数据占4个字节,计算机中是按小端方式储存的
a[5]={7,8,9,10,11}在内存中存储的形式(按16进制)为:
..................00 00 00 08 00 00 00 07
注意,在这里a+1和(int)a+1是不一样的,a+1指向数据8所在的内存地址,而(int)a+1则指向上面07前面的绿色的00所在的内存地址。因此*ptr2所指向的地址的数据为0x08000000(即为0x8000000)。
经过以上分析,可知输出结果为b,8000000
阅读(424) | 评论(1) | 转发(0) |