指针和数组的学习
在msOS的代码里有这个两句话
//first put in data, then increase u8MsgHead
((U8 *)(&(u16MsgArray[u8MsgHead])))[0] = MsgType;
((U8 *)(&(u16MsgArray[u8MsgHead])))[1] = Val;
抛开他们所执行的具体意义,仅从C语言层面上去理解。 u16MsgArray是文中定义的数组: static U16 data u16MsgArray[MSG_ARRAY_SIZE]; MSG_ARRAY_SIZE的值为4,4个short类型的数组,u8MsgHead取值范围0~3 咋一看,不理解什么意思,于是乎在电脑上调试了,平台为eclipse+mingw 实验代码如下:
unsigned short u16MsgArray[4]={
0,1,2,3
};
((unsigned char *)(&(u16MsgArray[0])))[0] = 4;
((unsigned char *)(&(u16MsgArray[0])))[1] = 5;
运行后的结果为:
u16MsgArray[4]={
1284,1,2,3
};
1284=0x504=0b'101 0000 0100
分析: &(u16MsgArray[0])意为首元素的地址,可以理解为指针; (unsigned char *)(&(u16MsgArray[0]))意为转换为unsigned char的指针,为了理解,记: unsigned short *u16_ptr = &(u16MsgArray[0]);(注意不能写成unsigned short *u16_ptr = u16MsgArray;即使指针的值不变,但这两个语句的意义不同,后续的指针转换也就不同了)。 这里的u16_ptr是数组指针,指向数组的指针,(顺便提一句,*u16_ptr[9]中的u16_ptr是指针数组的数组名) 然后再进行如下操作:
((unsigned char *)u16_ptr)[0] = 5;
((unsigned char *)u16_ptr)[1] = 6;
((unsigned char *)u16_ptr)[2] = 4;
u16MsgArray数组的值更新为:
{0x605,0x4,0x2,0x3}
注意,x86是小端模式,高地址存高位数,和我们平时写的数字是反着的,看着有些别扭,也佩服CPU的设计者。 内存地地址—————>高地址 u16MsgArray[0]—>u16MsgArray[3] 0x0022fee0—————>0x0022fee6 0506 0400 0200 0300 在测试中,添加((unsigned char *)(&(u16MsgArray[0])))[-1] = 7; 内存中显示(u16MsgArray[-1]) = 1792. 其中 &(u16MsgArray[-1]) = 0x0022fede 0x0022fede——>0x0022fee0—————>0x0022fee6 0007 0506 0400 0200 0300 以上的内存分布在eclips的memory里查看的 虽然在内存中,u16MsgArray[0]的显示为0506,但是实际的值为0x0605,即1541,这和变量的值一致的(eclipse的Variables查看的)。 同理:0x700 = 1792。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 如何查看docker run启动参数命令
- YAML 语言教程与使用案例
- 计算等压面要素场的基本检验指标
- Kubernetes K8S之SSL证书有效期修改
- Kubernetes K8S之通过yaml文件创建Pod与Pod常用字段详解
- Kubernetes K8S之kubectl命令详解及常用示例
- Kubernetes K8S之Pod 生命周期与init container初始化容器详解
- Kubernetes K8S之Pod生命周期与探针检测
- Kubernetes K8S之Pod 生命周期与postStart、preStop事件
- Kubernetes K8S之资源控制器RC、RS、Deployment详解
- python教程 | 最标准的地图调用方式(国家测绘局提供数据)
- Kubernetes K8S之资源控制器StatefulSets详解
- Kubernetes K8S之资源控制器Daemonset详解
- Kubernetes K8S之资源控制器Job和CronJob详解
- Kubernetes K8S在IPVS代理模式下Service服务的ClusterIP类型访问失败处理