zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    移位乘除法
    标准C++的一些约定
    图论的一些定义
    二进制取数在多重背包和母函数中的应用
    深入理解最小割的意义
    pku 3020 最小路径覆盖集
    pku 1986 LCA算法的应用
    pku 1185
    连通分量(tarjan算法)
    pku 2983 差分约束系统判断
  • 原文地址:https://www.cnblogs.com/ZhuLuoJiGongYuan/p/9465015.html
Copyright © 2011-2022 走看看