我对指针有点困惑,我想更新变量tmpTwoComplement
,如果我像这段代码一样更新,它确实可以工作:
int16_t max30205MeasureTemperature(int16_t *tmpTwoComplement) {
char regT = MAX30205_REG_TEMPERATURE;
max30205_raw_data rawTemp;
max30205_read_reg_as_temperature(regT, &rawTemp);
*tmpTwoComplement = rawTemp.swrd;
}
但这个没有,为什么?
int16_t max30205MeasureTemperature(int16_t *tmpTwoComplement) {
char regT = MAX30205_REG_TEMPERATURE;
max30205_raw_data rawTemp;
max30205_read_reg_as_temperature(regT, &rawTemp);
tmpTwoComplement = &rawTemp.swrd;
}
我总是把上面的函数称为
max30205MeasureTemperature(®isterTemp);
存在
typedef union max30205_raw_data {
struct {
uint8_t lsb;
uint8_t msb;
};
struct {
uint16_t magnitude_bits:15;
uint16_t sign_bit:1;
};
uint16_t uwrd;
int16_t swrd;
} max30205_raw_data;
tempSamplesUpdatedMAX30205 = true;
最佳答案
*tmpTwoComplement = rawTemp.swrd;
您将
rawTemp.swrd
的值写入tmpTwoComplement
所指向的位置,该位置恰好是变量registerTemp
的地址,因为您调用函数的方式:max30205MeasureTemperature(®isterTemp)
。因此,在退出函数后,registerTemp
将包含一个在cc>内的值的副本。tmpTwoComplement = &rawTemp.swrd;
在这种情况下。将局部变量
rawTemp.swrd
的地址复制到指针rawTemp.swrd
中,覆盖先前在指针中的tmpTwoComplement
地址。退出函数后,不会发生任何事情,因为函数的所有内部变量不再存在,并且代码没有写入函数之外的任何变量。您应该了解的是
registerTemp
是指向某个内存位置的指针。在第二种情况下,你总是可以让它指向不同的位置。但这本身并没有任何效果。实际上,您要做的是写入它指向的目标内存位置。这是通过使用tmpTwoComplement
来完成的。编辑:
你为什么不这样做,完全避免指针?
int16_t max30205MeasureTemperature(void) {
char regT = MAX30205_REG_TEMPERATURE;
max30205_raw_data rawTemp;
max30205_read_reg_as_temperature(regT, &rawTemp);
return rawTemp.swrd;
}
然后一起读,
registerTemp = max30205MeasureTemperature();