uint8_t* buffer; // pointer to 8 bit or simply one byte
缓冲区指向字节的内存地址 -> |byte0|byte1|byte2|....
(uint16_t*)&buffer[0] // &buffer[0] is actually the same as buffer
(uint16_t*)&buffer[0]
等于(uint16_t*)buffer
; 它指向 16 位或半字
(uint16_t*)buffer
指向内存:|byte0byte1 = halfword0|byte2byte3 = halfword1|....
w = *((uint16_t*)&buffer[18]);
将内存地址获取到缓冲区中的第 18 个字节,然后将此地址重新解释为半字地址,然后在此地址上获取半字;它只是w = byte18 和 byte19 粘在一起形成一个半字
h = *((uint16_t*)&buffer[22]);
h = byte22 和 byte 23 粘在一起
UPD更详细的解释:
h = *((uint16_t*)&buffer[22])
=>
1) buffer[22]
===缓冲区的第22个uint8_t(又名字节);我们称它为 byte22
2) &buffer[22]
=== &byte === byte22在内存中的地址;它是 uint8_t* 类型,与缓冲区相同;我们称之为 byte22_address;
3) (uint16_t*)&buffer[22]
= (uint16_t*)byte22_address; 将字节的地址转换为(两个字节粘在一起的地址;同一地址的半字地址;我们称之为 halfword11_address;
4) h = *((uint16_t*)&buffer[22])
=== *halfword11_address; * 运算符在地址处取值,即第 11 个半字或字节 22 和 23 粘在一起;