C两个小例子(数组与指针)

大端模式

所谓的大端模式,是指数据的高位,保存在内存的低地址中,而数据的低位,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;
例子:
0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000
0000440: b484 6c4e 004e ed00 0000 0000 0100 0000
在大端模式下,前16位应该这样读: e684
记忆方法: 地址的增长顺序与值的增长顺序相同

小端模式

所谓的小端模式,是指数据的高位保存在内存的高地址中,而数 据的低位保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。
例子:
0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000
0000440: b484 6c4e 004e ed00 0000 0000 0100 0000
在小端模式下,前16位应该这样读: 84e6
记忆方法: 地址的增长顺序与值的增长顺序相反

大小端模式

为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于 8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于 大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,刚好相反。我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。

下面两个例子,只有一个是可以正确输出的。如下:

例一:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main(void)
{	char a[20];int i;int *p=a;for(i=0;i<20;i++){a[i]=i;printf("a[%d]=%d\n",i,a[i]);}//p++;printf("%d\n",*p);printf("&P=0x%X\n",p);printf("a=0x%X &a=0x%X\n",a,&a);printf("&a[0]=0x%X\n",&a[0]);
}

重点讲一下第一个例子:

首先要知道存储的大小端问题:

大端模式,是指数据的高位,保存在内存的低地址中,而数据的低位,保存在内存的高地址中

小端模式,是指数据的高位保存在内存的高地址中,而数 据的低位保存在内存的低地址中

int main(void)
{//大端模式,是指数据的高位,保存在内存的低地址中,而数据的低位,保存在内存的高地址中//小端模式,是指数据的高位保存在内存的高地址中,而数 据的低位保存在内存的低地址中char x1,x0;int x=0x1122; x0=((char*)&x)[0]; //低地址单元 如果等于0X22就说明是小端模式 如果等于0X11就说明是大端模式  0x11是高位数据 0x22是低位数据x1=((char*)&x)[1]; //高地址单元 printf("x0=%x x1=%x\n",x0,x1);if(0x22==x0){printf("计算机是小端模式\n");}else{printf("计算机是大端模式\n");	}
}

最后得出是小端模式,也就 是数据的 位数据保存在 地址中 (一般情况,就我以前的编程经验,小端模式的计算机比较多)

好了,现在知道是小端模式了,那么。再看回上面的代码。

a数组从0~19 依次是a[0]~a[19]的值是0~19.

那么,我p的地址和a的地址是一样的,p指向a数组的首元素。而且p是指向int类型,a是char类型。那么*p应该是从a[0]到a[3]4个元素。p会取得这四个元素的值。

又因为是小端模式(高位数据在高地址,低位数据在低地址,原来3是在高位数据,肯定回到高位地址,也就是0X30201000)。这四个字节取出来的值应该是:00000011 00000010 00000001 00000000 也就是 3210 转成int就是:50462976



好了。从上面的例子来看,我很快得出一个想法,看下面的代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main(void)
{	char a[20];char b='0';int i;int *p;p=a;for(i=0;i<20;i++){a[i]=i;printf("a[%d]=%d\n",i,a[i]);}//p++;printf("%X\n",*p);printf("&P=0x%X\n",p);printf("b=%x b=%d\n",b,b);printf("a=0x%X &a=0x%X\n",a,&a);printf("&a[0]=0x%X\n",&a[0]);
}


例二:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main(void)
{	char a[20];int i;char *p=a;for(i=0;i<20;i++){a[i]=i;printf("a[%d]=%d\n",i,a[i]);}//p++;printf("%d\n",*p);printf("&P=0x%X\n",p);printf("a=0x%X &a=0x%X\n",a,&a);printf("&a[0]=0x%X\n",&a[0]);
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469645.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智慧交通day03-车道线检测实现03:相机校正和图像校正的实现

1.相机标定 根据张正友校正算法&#xff0c;利用棋盘格数据校正对车载相机进行校正&#xff0c;计算其内参矩阵&#xff0c;外参矩阵和畸变系数。 标定的流程是&#xff1a; 准备棋盘格数据&#xff0c;即用于标定的图片对每一张图片提取角点信息在棋盘上绘制提取到的角点&a…

win10编辑js文件报错,错误','

在filezilla中编辑js文件报错&#xff0c;在本地可以使用文本编辑&#xff0c;但需重新上传覆盖&#xff0c;很不方便 在win10默认应用中修改为文本编辑即可&#xff0c;在FTP编辑&#xff1a; 直接可以打开编辑

智慧交通day03-车道线检测实现04:车道线提取原理+代码实现+效果图

我们基于图像的梯度和颜色特征&#xff0c;定位车道线的位置。 在这里选用Sobel边缘提取算法&#xff0c;Sobel相比于Canny的优秀之处在于&#xff0c;它可以选择横向或纵向的边缘进行提取。从车道的拍摄图像可以看出&#xff0c;我们关心的正是车道线在横向上的边缘突变。Ope…

linux下的shell编程

下面是一个最简单的shell: 例5&#xff1a;输入参数 $#是指参数个数、$是所有输入的参数 #! /bin/sh echo "$# parameters"; echo "$";wqfwqf-System-Product-Name:/worksen/linuxshell$ ./echo.sh ad 1 parameters ad新建一个shell. gedit echo.sh 输入以…

C#通过修改注册表改变IE默认选项

修改注册表&#xff0c;这个代码好实现&#xff0c;关键是怎么找到对应的注册表值&#xff0c;也就是说画一条线很容易&#xff0c;难的是找到要在哪里画&#xff0c;然后我百度了一圈&#xff0c;出来的都是画线的&#xff0c;没有指出或者指出的不全的注册表对应值&#xff0…

宝塔+wordpress搭建/迁移网站

使用宝塔linux和阿里云ECS搭建网站/从百度云服务器迁移网站到阿里云ECS 为服务器安装宝塔软件 示例&#xff1a; ECS:Ubuntu 18.04 打开阿里云控制台&#xff0c;进入已绑定的实例页面&#xff0c;使用workbench或者VNC&#xff08;推荐使用workbench&#xff0c;workbench可…

智慧交通day03-车道线检测实现05:透视变换+代码实现

为了方便后续的直方图滑窗对车道线进行准确的定位&#xff0c;我们在这里利用透视变换将图像转换成俯视图&#xff0c;也可将俯视图恢复成原有的图像&#xff0c;代码如下&#xff1a; 计算透视变换所需的参数矩阵&#xff1a; def cal_perspective_params(img, points):offs…

LOCAL_MODULE_TAGS 选项说明(android编译选项选择)

LOCAL_MODULE_TAGS &#xff1a;user eng tests optional user: 指该模块只在user版本下才编译 eng: 指该模块只在eng版本下才编译 tests: 指该模块只在tests版本下才编译 optional:指该模块在所有版本下都编译 eng This is the default flavor. A plain "make" is t…

李宏毅老师ML_HW1——PM2.5预测

处理数据之前的pre-process 观察下载的数据文件train.csv train.csv只有每个月前20天的数据&#xff0c;另外每个月剩下10天数据用于作业结果评估&#xff0c;对学生不可见 观察数据发现rainfall栏有很多NR表示没有降雨&#xff0c;但是我们只需要数字&#xff0c;因此可以使用…

“员工请假”流程及在线表单开发示例

1. “员工请假”流程及在线表单开发示例 1.1. 描述 通过本示例达到快速对F2流程管理平台的在线表单速讯上手及零编码式的开发。实现一个以请假为示例的流程及在线表单&#xff0c;及请假数据的查询。 1.2. 目标效果 &#xff08;1&#xff09; 如何配置一个“请假在线表单” &a…

【Pytorch神经网络基础理论篇】 03 数据操作 + 数据预处理

同学你好&#xff01;本文章于2021年末编写&#xff0c;已与实际存在较大的偏差&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)…

git版本控制系统常用指令,Xmind笔记整理

git仓库使用、项目版本管理基本常用指令 纯手工整理Xmind笔记&#xff1a; 点我下载 预览图&#xff1a; Png&#xff1a; 如有错误&#xff0c;谢谢指出

Spark学习(一) -- Spark安装及简介

标签&#xff08;空格分隔&#xff09;&#xff1a; Spark 学习中的知识点&#xff1a;函数式编程、泛型编程、面向对象、并行编程。 任何工具的产生都会涉及这几个问题&#xff1a; 现实问题是什么&#xff1f;理论模型的提出。工程实现。思考&#xff1a; 数据规模达到一台机…

ValueError:only one element tensors can be converted to Python scalars

缘由是&#xff1a;要转换的list里面的元素包含多维的tensor。c

java起步

例1&#xff1a; javac HelloWorld.java 这是编译 java HelloWorld 这是运行 gedit helloworld.javapublic class helloworld {public static void main(String args[]){int num;num3;System.out.println("this is num"num);} }

Django基本概念、安装、配置到实现框架,Xmind学习笔记

Django从安装、配置到实现简单web框架的基本操作流程 纯手工Xmind笔记整理&#xff1a; 点我下载 预览图&#xff1a; 如有错误&#xff0c;谢谢指出

解决若要安装 Microsoft Office 2010,需要MSXML 版本 6.10.1129的问题

单击 开始单击 运行键入 注册表编辑器然后单击 确定.找到HKEY_CLASSES_ROOT\TypeLib\{F5078F18-C551-11D3-89B9-0000F81FE221}\6.0\0\win32。用鼠标右键单击 win32然后单击 权限.为自己授予完全控制到的项。双击 &#xff08;默认值&#xff09; 在下的值 win32然后再更改它的值…

ValueError matplotlib display text must have all code points 128 or use Unicode strings

错误问题&#xff1a;ValueError: matplotlib display text must have all code points < 128 or use Unicode strings 错误原因&#xff1a;在使用matplotlib进行图表展示时&#xff0c;如果需要在图表上添加中文&#xff0c;可能会报字符类型的值错误。 解决办法&#x…

VC6.0常见英文错误对照表

fatal error C1003: error count exceeds number; stopping compilation 中文对照&#xff1a;&#xff08;编译错误&#xff09;错误太多&#xff0c;停止编译 分析&#xff1a;修改之前的错误&#xff0c;再次编译 fatal error C1004: unexpected end of file found 中文…

Django 页面报错 Maximum recursion depth exceeded

Django 页面报错 Maximum recursion depth exceeded 原因&#xff1a; 视图中某个方法或函数的名称与django模块里的方法重名&#xff0c;而且在内部又调用了同名的方法导致重复调用自己 解决方法&#xff1a; 1、logout()换一个命名 # 退出登录使用logout(request)&#xf…