关于数据存储大小端模式的C语言题目

2023-05-16

int main()
{
    int a[5]={1,2,3,4,5};
    int *ptr1=(int *)(&a+1);
    int *ptr2=(int *)((int)a+1);
    printf("%x,%x",ptr1[-1],*ptr2);
    return 0;
}
首先附上1张图片,该图片是我在验证的时候数据的存储方式。
这道C语言的题目看似简单,但是涉及的C语言的知识点还是很多的,比如,指针,强制类型转化,并且这里的的强制类型转换还和地址相关,
以及操作系统的大小端模式,数组名的含义等等。
分析:
1行代码:这行代码定义并初始化了一个数组
2行代码:将这行代码分解开来会好理解一些,&a的理解:a是数组名,是数组首元素的地址,也就是&a[0]的值,这个值是整个数组的首地址,
所以&a数值上和&a[0]一样,但是代表的意义不一样,(&a[0]+1)表示的是a[1]这个元素的地址,但是(&a+1)表示确实跨过这个数组的那个地址,
也就是元素a[4]所在地址后面的那个地址,证明如下:

int main()
{
   int a[5]={1,2,3,4,5};
   printf("&a[0]=%p\n",&a[0]);
   printf("&a[0]+1=%p\n",&a[0]+1);
   printf("&a[4]=%p\n",&a[4]);
   printf("&a[4]+1=%p\n",&a[4]+1);
   printf("&a=%p\n",&a);
   printf("&a+1=%p\n",&a+1);
   return0;
}
结果:
&a[0]=0060FF10
&a[0]+1=0060FF14
&a[4]=0060FF20
&a[4]+1=0060FF24
&a=0060FF10
&a+1=0060FF24


(int *)(&a+1)的理解:根据上面得到的结论,&a+1=0060FF24,表示的是一个地址一样的数值,通过int*强制转换为地址。
int *ptr1=(int *)(&a+1)的理解:定义int类型的指针变量prt1指向(int *)(&a+1)所代表的地址,也就是&a+1=0060FF24
这个地址,显然这个地址是数组的最后一个元素的地址的下一个地址


ptr1[-1]的理解:数组下标是可以为负数的,实际上,取下标符“[ ]”的内部实现,就是指针运算!比如a[2],等价于*(a+2),
即以a地址为基址,取偏移量为2的地址的值。所以ptr1[-1]等价于*(ptr1-1)。那么printf("%x ",ptr1[-1]);的结果是就是在
0060FF24地址的基础上向前移动一个int大小的空间,并指向0060FF20地址里的内容也就是a[4]=5.


3行代码的分析; (int)a是把地址类型强行转换为int类型的数组,同时+1,注意,这里的1默认是int类型
(C规定整数默认int类型,小数默认double类型,在很大程度上是为了保证精度),所以(int)a+1就是在0060FF10的基础上+1
也就是0060FF11。int *ptr2=(int *)((int)a+1)的理解:看完之前的文字再看这里不难看出,ptr2指向0060FF11这个地址,
因为是int类型的指针,所以将0060FF11之后的连续四个地址理解为一个地址空间,0060FF11,0060FF12,0060FF13,0060FF14,
其中0060FF11,0060FF12,0060FF13,这三个地址里面的数字为0,0060FF14地址里的数值为2,那么这几个地址如何安排组成
一个int类型的数字呢,这道题之所以强调x86系统就是因为这个操作系统采用的是小端模式存数据的,所以之前的所有结论也都
是基于这个所说,如果是大端模式的存储方式,上面的结论也就不对了。既然是按照小端模式(little_endian)存储的也就是
高字节的数据存数在高地址,低字节存储在低地址,所以*ptr2指向的就是由0060FF11,0060FF12,0060FF13,0060FF14这四个
字节组成的int数据,很明显这个int型的数据就是0x02000000


所以上面的题目的打印结果就是5,2000000

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于数据存储大小端模式的C语言题目 的相关文章

  • 线性判别分析(Linear Discriminant Analysis,LDA)

    基础不牢 xff0c 地动山摇 线性判别分析 xff08 Linear Discriminant Analysis xff0c LDA xff09 是一种经典的线性学习方法 xff0c 它既可以用于分类问题 xff0c 也可以用于有监督的特
  • java中HashMap原理

    1 为什么用HashMap xff1f HashMap是一个散列桶 xff08 数组和链表 xff09 xff0c 它存储的内容是键值对 key value 映射HashMap采用了数组和链表的数据结构 xff0c 能在查询和修改方便继承了
  • 手把手教你撸touchgfx的数字键盘(一)

    目录 1 准备工作 1 1 软件准备 1 2 硬件准备 2 键盘制作 2 1 键盘背景图设计 2 2 自定义键盘控件 2 3 screenview与keyboard之间传递消息 3 实验效果 4 功能拓展和项目资料 4 1 改进的方面 4
  • svn 命令行使用总结

    1 上传项目到SVN服务器上 svn import project dir xff08 本地项目全路径 xff09 http 192 168 1 242 8080 svn IOS Ben remote dir xff08 svn项目全路径
  • Ubuntu 基本使用和Bash编程基础

    Ubuntu基本使用 sudo 申请权限 linux 包管理工具 yum apt apt install XXX apt remove XXX apt autoremove XXX 常用指令 cd 进入目录 ls 查看文件 以点为开头的文件
  • CentOS7如何操作防火墙

    CentOS7中如何操作防火墙 查看防火墙状态 xff1a 命令 xff1a systemctl status firewalld service test 64 test1 systemctl status firewalld servi
  • ROS进二阶学习笔记(1) TF 学习笔记1:TF介绍 + tf工具

    ROS进二阶学习笔记 xff08 1 xff09 TF 学习笔记1 TF介绍 43 tf工具 Ref http wiki ros org tf Tutorials Learning tf gt gt Ref http wiki ros or
  • RGB颜色对照表

    修改字体颜色 xff0c 大小使用示例如下 xff1a lt font color 61 FFB6C1 size 61 5 face 61 34 隶书 34 gt color 61 FFB6C1 size 61 72 face 61 34
  • 顿悟系列-JS对象键值修改,删除

    在Angular开发中 xff0c 遇到了JS对象键值对的知识实际运用 xff0c 不常见 xff0c 但实用 假设我们需要把 var a 61 a 34 张三 34 b 34 24 34 c 34 帅哥 34 a这个对象的键值全部改变自己
  • OVN简介

    作者简介 xff1a 郑敏先 xff0c 就职于诺云系统 xff08 上海 xff09 有限公司 工作地点为南京的诺云研发中心 担任解决方案工程师 本人博客为 xff1a http blog csdn net zhengmx100 一 为什
  • Windows 实现 读取 HDFS 上 文件内容

    前几天一直在搞HDFS文件的下载与上传 xff0c 但是在集群内部可以 xff0c 在集群外部却出现了错误 xff0c 照说 xff0c HDFS的保密协议应该没那么高吧 xff0c 不解中 后来才发现自己网上找的代码 xff0c 却并未理
  • 图像地点场景类型识别(PlaceCNN)实践

    从图像中判断图像场景所处的地点类型 xff0c 是图像理解的一种常见任务 本质上场景类别标注数据足够的情况下 xff0c 它可以属于图像分类的一种 xff0c 因此直接利用现有成熟的网络架构如ResNet就可以实现较高精度的图像涉及场所的识
  • 【2021最新】Keras自定义Loss函数+接受输入+KerasTensor天坑解决方法

    文章目录 自定义函数 43 输入方法第一个错误第二个错误 自定义函数 43 输入方法 环境配置 xff1a Tensorflow2 4 xff0c keras2 4 3 Keras自定义Loss函数 xff0c 增加输入的方法 xff0c
  • 从零使用OpenCV快速实现简单车牌识别系统

    从零使用OpenCV快速实现简单车牌识别系统 这篇文章献给所有第一次听说车牌识别ANPR但需要短时间实现的苦逼同学们 最近的小学期实训做的是一个车牌识别系统 xff0c 说实话真不知道学校怎么想的 xff0c 虽然说图像处理也算的上是数字媒
  • SUMO交通仿真-核心概念和基础知识速览

    文章目录 sumo环境变量设置注意事项路网配置JOSM对地图进行 96 清洗 96 交通需求建模route amp trip输入数据方法流量路由分配 检测线圈车辆属性设置速度分布 特殊设置驾驶员状态事故仿真 仿真运行设置sumocfg 输出
  • Haar分类器原理1——矩形特征与积分图

    引言 Haar分类器又称Viola Jones识别器 xff0c 是Viola和Jones分别在2001年的 Rapid Object Detection using a Boosted Cascade of Simple Features
  • window打开服务的dos命令

    微软系统必备的dos命令 开始 gt 运行 输入以下命令 xff0c 或者win 43 R xff0c 输入以下命令 1 gpedit msc 组策略 2 sndrec32 录音机 3 Nslookup IP地址侦测器 4 explorer
  • 如何在windows server 2003服务器上创建web服务器和ftp服务器

    将xp客户机和server2003设置为同一网段VMnet1上 配置web服务器的IP地址 配置xp客户机的IP地址 检测xp客户机和web服务器是否互通 将文件解压缩到d盘 xff0c 查看到三个文件夹 安装web服务组件 打开开始 管理
  • Kali Linux 2020.3如何安装中文输入法

    安装ibus拼音输入法 sudo apt get install ibus ibus pinyin 设置ibus为首选默认输入法 im config 输入法配置的重要提示信息 xff0c 点击OK即可 是否确认更改设置输入法 xff0c 点
  • Markdown编辑器

    Markdown编辑器 按照Markdown编辑器的使用环境 xff0c 可以将它们归纳为三类 平台集成工具 xff1a 各大在线博客 社区平台自带的写作工具 xff0c 比如CSDN 博客园 简书等 独立软件类 xff1a 下载到自己机器

随机推荐

  • devstack安装OpenStack Pike版本 (OVN+VLAN)

    控制节点配置文件 Sample DevStack local conf This sample file is intended to be used for your typical DevStack environment that 3
  • Fiddler抓包Java请求遇到的问题(一)

    Fiddler 解决无法监听 Java 的 HttpUrlConnection 请求 官网 https www telerik com fiddler Q JavaTraffic jre DproxySet 61 true DproxyHo
  • Win10系统正确设置MTU值加快WIFI速度的方法

    MTU是Maximum Transmission Unit缩写 xff0c 中文名 xff1a 最大传输单元 工具 原料 硬件 xff1a 电脑 操作系统 xff1a Windows 10 方法 步骤 第一步 xff1a 查询自己电脑的MT
  • CentOS-7 安装Lustre-2.10.1文件系统

    注 xff1a 原创文章 xff0c 转载请注明出处 一 文档说明 Lustre 是一种强大的平行 分布式文件系统 xff0c 通常用于HPC行业 主要组建包括 xff1a 元数据服务器 Metadataservers xff0c MDSs
  • 【华为练习题】求麻将清一色和牌问题

    华为练习题 求麻将清一色和牌问题 题目 题目描述 xff1a 清一色是麻将番种之一 xff0c 指由一种花色的序数牌组成的和牌 数字1 9 xff0c 每个数字最多有4张牌 我们不考虑具体花色 xff0c 我们只看数字组合 刻子 xff1a
  • 使用vscode开发stm32

    vscode 下载地址 xff1a https code visualstudio com 安装插件 xff1a Cortec Debug Cortex Debug Device Support Pack STM32F1 图1 vscode
  • typedef 的用法

    typedef 的用法 以下是参考部分 此部分参考自 xff1a http blog sina com cn u 572f7666010008dm 用途一 xff1a 定义一种类型的别名 xff0c 而不只是简单的宏替换 可以用作同时声明指
  • C语言变参的使用

    C语言中有很多变参的使用 xff0c 例如printf 的原型是int printf const char fmt xff0c 那么C语言是如何解析和处理这些变参的呢 xff1f 下面进行简单的总结 xff1a C语言中定义了下面的一些宏
  • strstr函数的精彩之处

    在C的库函数里面有很多精彩的代码 xff0c 仔细分析会体会到这些写法和思路的巧妙之处 写strstr函数的时候要判断两个字符换str1和str2什么时候开始匹配 xff0c 什么时候结束 xff0c 这两点都是比较容易做到的 xff0c
  • RISC与CISC

    作者 xff1a Austin Wang 链接 xff1a http www zhihu com question 20783321 answer 72598657 这里简单来谈一下 xff0c ARM和X86之间为什么不太具有可比性的问题
  • NandFlash和NorFlash的区别

    一 xff0e NAND和NOR的比较 NOR和NAND是现在市场上两种主要的非易失闪存技术 Intel于1988年首先开发出NOR flash技术 xff0c 彻底改变了原先由EPROM 和EEPROM一统天下的局面 紧接着 xff0c
  • 安装 CORD 之前需要了解的术语

    CORD Central Office Re Architected as a Data Center 是ONF组织推动的开源的边缘计算的项目 CORD 项目的官方资料包括源代码 xff0c 安装指导等 本文对官方安装指导涉及的一些术语进行
  • SoC嵌入式软件架构设计之一:系统内存需求评估

    博主 xff1a 吴跃前 转载自 xff1a http www cnblogs com yueqian scut p 4015046 html SoC嵌入式软件架构设计之一 xff1a 系统内存需求评估 内存是SoC System on C
  • S5PV210启动过程分析

    刚刚接触 S5PV210 xff0c 看了官方的数据手册感觉跟以前用的 STM32 单片机根本不在一个层面上 xff0c 当然两者的用途不同 xff0c 不具备可比性 可能之前习惯使用 STM32 等单片机 xff0c 现在接触 S5PV2
  • ARM支持的4种堆栈工作方式

    1 满递增堆栈 xff1a 堆栈指针指向最后压入堆栈的数据 xff0c 且由低地址向高地址生成 2 满递减堆栈 xff1a 堆栈指针指向最后压入堆栈的数据 xff0c 且由高地址向低地址生成 3 空递增堆栈 xff1a 堆栈指针指向下一个要
  • 前变址、回写前变址、后变址

    根据数据传输传输的时机以及在指令执行后基址寄存器是否被更新 xff0c 寄存器变址有前变址 回写前变址和后变址暗中方式 执行指令的时候 xff0c 如果先进行变址运算 xff0c 后传递数据 xff0c 那么这种方式就是前变址方式 如图1所
  • ubuntu 配置 tftp 服务器

    注意 xff1a 1 tftpboot为根目录 2 已经是root权限不用再加sudo 临时获取权限 3 使用netstat au grep tftp xff0c 保证tftp是启动的 出现 udp 0 0 tftp 则说明tftp服务已经
  • STM32启动文件详解

    先在RAM中分配系统使用的栈 xff0c RAM的起始地址为0x2000 0000 然后在RAM中分配变量使用的堆 然后在CODE区 flash 分配中断向量表 xff0c flash的起始地址为0x0800 0000 xff0c 该中断向
  • C语言细节之定义与声明

    什么是定义什么是声明 xff0c 似乎这俩个东西一样但是又有所区别 xff0c 思考一下 xff0c 如果你不能直接说出这二者的根本区别 xff0c 那么本文对你还是有点用处的 首先什么是定义 xff1f C 43 43 Primer 第四
  • 关于数据存储大小端模式的C语言题目

    int main int a 5 61 1 2 3 4 5 int ptr1 61 int amp a 43 1 int ptr2 61 int int a 43 1 printf 34 x x 34 ptr1 1 ptr2 return