12.用学到的内存指针知识来分析下面的代码输出什么? 主要分析*ptr2

1 #include <stdio.h> 
2 int main() 
3 { 
4     int a[5] = {1,2,3,4,5}; 
5     int *ptr1 = (int *)(&a + 1); 
6     int *ptr2 = (int *)((int)a + 1); //主要分析这个
7     printf("%x, %x",ptr1[-1], *ptr2); 
8     return 0; 
9 }

第一步:需要画在内存中数据存储的分布。

但是想画出a[5]在内存中的分布图,必须得知道三个知识:
1.连续申请新内存空间时,不同的段有不同的发展方向
   在栈中连续申请新内存空间时: 从高字节到低字节的方向开辟新内存空间给用户使用
   在堆中连续申请内存空间时 从低字节到高字节的方向开辟新内存空间给用户使用
没用到此点。

2.在已申请好的一整块连续空间内, 往里存储数据时, 都是从低字节到高字节的顺序依次存储一个个完整独立的数据。
从这一点,可知道数组a所有元素在内存中存储的排列顺序方向,a[0] -> a[4],从低字节到高字节顺序存储每个元素的。

3.大端序小端序 则是站在一个单独数据的内部每个字节存储顺序的角度上来分析的
   小端序:一个数据的高位数存放在高字节上。
   大端序:一个数据的高位数存放在低字节上。
首先确定,本机是小端序,那从这一点,可以确定每个元素在32位大小的内存空间中,低位数是存在低地址上。依次由低到高填满32位内存。比如a[0]数据值1的存储为:
00
00
00
01

所以最终可以确定,数组a在内存中的存储分布:
高地址
00
00
00
05
00
00
00
04
00
00
00
03
00
00
00
02
00
00
00
01
低地址

第二步:此时就可确定ptr2所指向的空间中的数据为多少
03
00
00
00
02
00
00
00       <-  ptr2
01
低地址

最终*ptr2按%x打印 2000000
按%p则打印02000000

原文地址:https://www.cnblogs.com/ZhuLuoJiGongYuan/p/9465015.html