||
#define DATA *((Uint16 *)0x100000);
*(&DATA+1) = DATA_B;
首先 *((Uint16 *)0x100000) 意思 就是 从 地址 0x100000 处 读取 一个 Uint16 类型的 变量,先把 这个变量 记做 x
#define DATA *((Uint16 *)0x100000) // 以后 遇到 DATA 就用 *((Uint16 *)0x100000) 取代;
*(&DATA+1) = DATA_B; //等效于 *(&*((Uint16 *)0x100000)+1) = DATA_B;
含义 是 取x的地址,再+1,再 取指针,这个 变量 记做 y;
由于 x 是 Uint16 类型,占 2个字节,所以 指针 +1 就是 地址+2,于是 &y=0x100002;
那么 *(&DATA+1) = DATA_B; 执行的 结果 就是 地址 0x100002 处 的 数据 = DATA_B;
那么 *(&DATA+1) = DATA_B; 执行的 结果 就是 地址 0x100002 处 的 数据 = DATA_B;
追问 Uint16是usigned int。 我最大的疑问就是怎么理解“*((Uint16 *)0x100000) =从地址0x100000 处读取一个 Uint16 类型的变量”? 一个地址的指针的指针是什么意思呢?
追答
楼主 说 Uint16是usigned int 那么 你 写的 是 单片机程序了。。。因为在 计算机里 Uint16是usigned short 先看 以下2个的区别 ((Uint16 *)0x100000) 和((Uint16 )0x100000) 前者 比 后者 就多一个 * * 是 指针的 意思 前者 是 有一个 指针,这个指针 指向一个 Uint16 类型的 数; 后者 就是一个数 把0x100000 强制转换为 Uint16 ,结果 是 0x0000; #define DATA *((Uint16 *)0x100000) 是 定义DATAS指向0x100000地址的一个指针,并且元素占16位(2个字节); *(&DATA+1) = DATA_B; 将DATA指向的下一个元素(地址是0x100002)赋值为DATA_B; 第一句:将地址在0x00100000这个地方的数据定义为DATA,类型是Uint16 第二句,讲DATA+1这个位置(0x00100002) 的数据赋值为DATA_B
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2023-9-24 18:21
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社