有时候我们会弄不清什么时候用指针,什么时候不用指针。我习惯性是不用指针的,因为我自己用不好指针,可能出现某些bug。但是一个合格的程序员,即使不用指针,也应该掌握使用指针的各种用法。
碰到下面这种情况的时候,必须使用指针。
uint8_t obu_buffer_[kBufferSize] = {0};
int length = data_stream_->read(obu_buffer_, kBufferSize, 0);
// 路端传给车端的数据:头 + obuMsg长度 + ObuMsg + 校验和
// 1.头 :2字节 , 0x60,0x61
// 2.obuMsg长度 : 2字节
// 3.ObuMsg :长度视其内容而定
// 4.校验和: 1个字节 ,为前面所有字节的校验和
if (obu_buffer_[0] == 0x60 && obu_buffer_[1] == 0x61) {
std::memset(&v2x_message_, 0, sizeof(v2x_message_));
read_obu_failed_count_ = 0;
uint16_t* obu_length = reinterpret_cast<uint16_t*>(&obu_buffer_[2]);
}
上面的 obu_buffer_[]
是uint8_t
类型,但是通过udp的data_stream_->read(obu_buffer_, kBufferSize, 0);
读取后,obu_buffer_被赋值,他的值是连续内存的值。
obu_buffer_[2]
和obu_buffer_[3]
分别为1个字节,连在一起这两个字节的内容组成了 【obuMsg长度 : 2字节】,所以此时我么使用指针的方式uint16_t* obu_length = reinterpret_cast<uint16_t*>(&obu_buffer_[2]);
将两个uint8_t类型数据的地址
组合在一起并reinterpret_cast为uint16_t*
,才能获取到obuMsg长度,此时是不能分别通过obu_buffer_[2]
这种方式来获取到obuMsg长度。