1.指针变量作为形参时,此指针变量指向什么类型的数据,在内存中一次取值大小是按照此类型的大小取的;
如TestPointer()函数中,uint32*和uint8*在一次取值时,取的字节数是不同的,赋值给同一个uint16的变量时,uint32会截取低的2个字节;而uint8的高字节会补0。
2.在定义结构体变量时,会存在对齐的问题,尽量小字节的在上,大字节的在下:
如结构体TestDataType_struct,下列两种形式在内存中的存储是不同的。
typedef struct
{
uint16_t DataID;
uint32_t Data;
uint8_t BlockID;
} TestDataType_struct1;
typedef struct
{
uint8_t BlockID;
uint16_t DataID;
uint32_t Data;
} TestDataType_struct2;
TestDataType_struct1内存中的存储方式:会在DataID后面补齐2个字节,与uint32的Data对齐;
TestDataType_struct2内存中的存储方式:会在BlockID后面补齐1个字节,与uint16_t 的DataID对齐;
3.在处理指针变量时,最好用下面的强制类型转换的方式,先将指针变量强制转换为想要的变量类型的指针,然后进行赋值处理等,如
CCC_struct_Pointer=(TestDataType_struct*)Data;
BBB_struct.BlockID=CCC_struct_Pointer->BlockID;
BBB_struct.DataID=CCC_struct_Pointer->DataID;
BBB_struct.Data=CCC_struct_Pointer->Data;
4.为了避免上面的问题,在运用指针变量作为形参时,最好使形参和实参的类型保持一致,这样就不会存在问题,如
void TestPointer(TestDataType_struct* Data)
{
BBB_struct.BlockID=Data->BlockID;
BBB_struct.DataID=Data->DataID;
BBB_struct.Data=Data->Data;
}