我有一个 ATMega328
并且我正在使用 <avr/eeprom.h>
函数来使用内置的 EEPROM
。
我可以正确使用 EEPROM
但我不明白我传递给 EEPROM
函数的函数参数。
例如,要编写我可以使用的不同类型的数据
void eeprom_update_byte (uint8_t *addr, uint8_t value);
void eeprom_update_word (uint16_t *addr, uint16_t value);
void eeprom_update_dword (uint32_t *addr, uint32_t value);
void eeprom_update_float (float *addr, float value);
addr
参数)会根据所使用的函数而变化呢?如果 addr
只是指向一个有效的 EEPROM
地址,为什么每个函数中的类型都不同? void *
函数中使用 EEPROM
也让我感到困惑。我知道 void *
可以指向任何地址,所以我假设该函数只是将 src
中的数据逐字节写入,但我不确定这是否正确? void eeprom_update_block (const void *src, void *dst, size_t n);
最佳答案
列出的前四个函数定义了正在写入的对象的类型。所以在内部函数可能是这样的:
void eeprom_update_float (float *addr, float value)
{
*addr = value;
}
这通过确保目标指针与源变量相同来提供类型安全优势(例如,不能将
float
写入 uint16_t
)。最终版本
void eeprom_update_block()
只是将任意内存块写入给定地址。它可能在下面使用类似 memcpy
的东西:void eeprom_update_block (const void *src, void *dst, size_t n)
{
memcpy(dst, src, n);
}
此版本的函数没有任何类型安全优势,但可用于将重要数据写入内存。例如,一个结构体可以这样写:
eeprom_update_block(&myStruct, dst, sizeof(myStruct));
关于c - 为什么这些函数使用不同的指针和空指针?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40976844/