
指针和数组的学习
发布日期:2021-05-14 09:00:20
浏览次数:23
分类:精选文章
本文共 1455 字,大约阅读时间需要 4 分钟。
在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。发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年05月03日 16时29分21秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
LIVE 预告 | 牛津胡庆拥:学习理解大规模点云
2021-05-15
java有道翻译
2021-05-15
lora技术在无线抄表行业应用
2021-05-15
leetcode——区域和检索
2021-05-15
msfvenom的使用&免杀&外网渗透
2021-05-15
HTTP/2 协议详解
2021-05-15
grafana改用https登录
2021-05-15
使用jenkins进行项目的自动构建部署
2021-05-15
使用MySQLTuner-perl对MySQL进行优化
2021-05-15
2018年3月最新的Ubuntu 16.04.4漏洞提权代码
2021-05-15
异或交换两个数的值
2021-05-15
使用python绘出常见函数
2021-05-15
Golang AES加密
2021-05-15
Puppet的一些奇技淫巧
2021-05-15
foreman源NO_PUBKEY 6F8600B9563278F6
2021-05-15
亚马逊aws文档语法错误
2021-05-15
什么是5G?居然有人用漫画把它讲得如此接地气!
2021-05-15
Spring cloud --分布式配置中心组件Spring Cloud Config
2021-05-15
IDEA的git窗口看不到代码更改界面
2021-05-15
UE4接入Android第三方库2——通过JIN与GameActivity通信
2021-05-15